Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variables globales

9 réponses
Avatar
JBB
a = 1
def inc() :
a = a+1
return a

inc()




comment je fait pour faire marcher ça ?

9 réponses

Avatar
yves
On Mon, 24 Oct 2005 19:34:50 +0200, JBB wrote:

Bonjour,

a = 1
def inc() :
a = a+1
return a

inc()

comment je fait pour faire marcher ça ?


Ca, peut-être:
#########
a = 1
def inc(coucou):
coucou = coucou + 1
return coucou

print inc(a)
#############

Variable globale -> beurk

--
Yves

Avatar
Christophe Cavalaria
JBB wrote:

a = 1
def inc() :
a = a+1
return a

inc()




comment je fait pour faire marcher ça ?


Pour les cas de force majeure, il y a le mot clef global.

Avatar
Do Re Mi chel La Si Do
Bonsoir !


a = 1
des inc() :
global a #voilà l'info cherchée.
a = a+1
inc()

Et, inutile de retourner une variable globale.

Et voici la version adaptée au point de vue d'Yves :

beurk = 1
des inc() :
global beurk
beurk += 1
inc()



@-salutations

Michel Claveau
Avatar
bruno modulix
JBB wrote:
a = 1
def inc() :
a = a+1
return a

inc()




comment je fait pour faire marcher ça ?


solution 1:

def inc(num):
return num + 1

a = 42
b = inc(a)

solution 2 (si tu dois maintenir plusieurs variables d'état, et que tu
ne peut pas facilement les passer d'une fonction à l'autre):

class MaClasse(object):
def __init__(self, num):
self.num = num
def inc(self):
self.num += 1
return self.num

m = MaClasse(42)
b = m.inc()


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Hervé Cauwelier
a = 1
def inc() :
a = a+1
return a

inc()

comment je fait pour faire marcher ça ?


Tu le reformules en prenant des cours de programmation au besoin. :-)

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
JBB
JBB wrote:
a = 1
def inc() :
a = a+1
return a

inc()




comment je fait pour faire marcher ça ?
et pourquoi

a = 1
def geta() :
return a
fonctionne dans ce cas , si a n'est pas 'globale' ?
c'est un peu comme si a était une variable globale mais uniquement en
lecture.

Avatar
R12y
comment je fait pour faire marcher ça ?
et pourquoi



Commence par répondre à quelqu'un au lieu d'à toi-même.

Moi je trouve logique que ton premier exemple ne fonctionne pas.
D'après moi, l'interpreteur voit que tu essaie de faire n'importe quoi
avec un type de variable. Donc il t'engueule.
C'est pourtant facile de déduire que ce truc est donc "intelligent" :-)

--
Rakotomandimby Mihamina,
http://aspo.rktmb.org/activites/infogerance
Serveurs* sous Debian, Fedora...
(*) Serveurs!?: http://fr.search.yahoo.com/search?p=serveurs+dedies


Avatar
bruno modulix
JBB wrote:
JBB wrote:

a = 1
def inc() :
a = a+1
return a

inc()


comment je fait pour faire marcher ça ?



<désolé>
Tu lui mets des jambes ?-)
(maman les ptits bateaux....)
</désolé>

et pourquoi
a = 1
def geta() :
return a
fonctionne dans ce cas , si a n'est pas 'globale' ?


C'est dans le Fameux Manuel.

c'est un peu comme si a était une variable globale mais uniquement en
lecture.


Yadça(tm)

Lors de la lecture, un nom est recherché d'abord dans l'espace de
nommage local (celui de la fonction), puis dans l'espace de nommage
'global' (celui du module), puis enfin dans les builtins.

Par contre, par défaut, l'assignation crée le nom dans l'espace local
s'il n'y existe pas déjà - et si le nom n'a pas été déclaré global.

En tout état de cause, utiliser une globale de cette façon est
généralement une Mauvaise Idée(tm).

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
tiissa
JBB wrote:
a = 1
def inc() :
a = a+1
return a

inc()

comment je fait pour faire marcher ça ?
et pourquoi

a = 1
def geta() :
return a
fonctionne dans ce cas , si a n'est pas 'globale' ?
c'est un peu comme si a était une variable globale mais uniquement en
lecture.


C'est un peu ca.

En fait, comme on s'y attend generalement, python gere un espace de nom
local pour chaque fonction. Dans le code :

def f():
s = []
for i in range(2):
s.append(i)

i et s sont deux noms locaux definis pour la fonction f. Ils ne sont
donc pas accessibles a l'exterieur et donc si i et/ou s est/sont
defini(s) a l'exterieur, je n'ai pas envie de les modifier.

Dit autrement le pseudo-code suivant pourrait avoir deux sorties 0 (si
isolation des espaces de nom) et 1 (un seul espace) :

a = 0
def f():
a = 1
print a

En python (depuis longtemps), le choix est d'ecrire 0. Ca evite en
particulier de nombreux problemes d'effets de bord non desires dus a
des collisions de nom dans des sous fonctions.

Si on veut que le resultat soit 1, il faut le preciser explicitement a
l'aide du mot-clef global.
Ca, c'est pour la premiere question.


D'un autre cote, comme tu l'as remarque, ca facilite les choses que le
code suivant ecrive 1, au lieu de renvoyer une exception NameError :

a = 1
def f():
print a

Il y a donc un peu de magie dans une fonction pour savoir de quel nom
on parle. Grosso modo, si dans le corps d'une fonction il y a une
affectation d'un nom 'a' a un objet ('a = ...') alors, dans toute cette
fonction, 'a' va etre local (meme avant la premiere affectation au
risque d'avoir l'exception UnboundLocalError). Sinon, s'il n'y a que
des 'acces en lecture', python considere, pour te faciliter la tache,
qu'il s'agit d'un nom global.


A noter que, dans ton premier exemple, tu passes l'objet associe au nom
'a' comme argument de la fonction. Dans ce cas du peux le modifier
(s'il est modifiable). Ce que tu ne peux pas faire (sans l'expliciter
avec global), c'est changer l'objet associe au nom d'origine dans le
contexte englobant (en effet, une affectation 'a = ...' n'est que
l'association dans l'espace de noms du nom 'a' a l'objet a droite).
Ainsi, le code suivant ecrit bien 1 et non 0 :

a = [0]
def inc(a):
a[0] = 1
print a[0]


En resume, pour bien comprendre ton probleme, il faut etre familier
avec le concept d'espace de nom. En particulier, il n'y a pas de
'variables' a proprement parler en python, mais plutot des associations
entre des noms et des objets.