Tu le reformules en prenant des cours de programmation au besoin. :-)
-- Hervé Cauwelier http://www.oursours.net/
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.
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.
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.
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" :-)
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" :-)
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" :-)
<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('@')])"
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 'onurb@xiludom.gro'.split('@')])"
<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('@')])"
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.
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.
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.