toto=1
def f1():
toto=2
def ff1():
print toto
toto=3
ff1()
f1()
Et l'exécution donne un joli, et normal, TraceBack :
Traceback (most recent call last):
...
File "D:Devpythonwin32pywigespacenom.py", line 7, in ff1
print toto
UnboundLocalError: local variable 'toto' referenced before assignment
Ma question : Suis-je légitime à utiliser cet exemple, pour (d é)montrer
que Python (du moins l'implémentation de Python que j'utilise) est
compilé, et non interprété ?
toto=1
def f1():
toto=2
def ff1():
print toto
toto=3
ff1()
f1()
Et l'exécution donne un joli, et normal, TraceBack :
Traceback (most recent call last):
...
File "D:Devpythonwin32pywigespacenom.py", line 7, in ff1
print toto
UnboundLocalError: local variable 'toto' referenced before assignment
Ma question : Suis-je légitime à utiliser cet exemple, pour (d é)montrer
que Python (du moins l'implémentation de Python que j'utilise) est
compilé, et non interprété ?
toto=1
def f1():
toto=2
def ff1():
print toto
toto=3
ff1()
f1()
Et l'exécution donne un joli, et normal, TraceBack :
Traceback (most recent call last):
...
File "D:Devpythonwin32pywigespacenom.py", line 7, in ff1
print toto
UnboundLocalError: local variable 'toto' referenced before assignment
Ma question : Suis-je légitime à utiliser cet exemple, pour (d é)montrer
que Python (du moins l'implémentation de Python que j'utilise) est
compilé, et non interprété ?
Tant que j'y suis, une question sémantique.
Dans le message :
UnboundLocalError: local variable 'toto' referenced before assignment
Je trouve les termes légèrement contradictoires, car 'bound' et
'assignment' sont traités comme des synonymes.
Ne serait-il pas préférable d'avoir :
UnboundLocalError: local variable 'toto' referenced before binding
ou
UnassignedLocalError: local variable 'toto' referenced before assignment
Tant que j'y suis, une question sémantique.
Dans le message :
UnboundLocalError: local variable 'toto' referenced before assignment
Je trouve les termes légèrement contradictoires, car 'bound' et
'assignment' sont traités comme des synonymes.
Ne serait-il pas préférable d'avoir :
UnboundLocalError: local variable 'toto' referenced before binding
ou
UnassignedLocalError: local variable 'toto' referenced before assignment
Tant que j'y suis, une question sémantique.
Dans le message :
UnboundLocalError: local variable 'toto' referenced before assignment
Je trouve les termes légèrement contradictoires, car 'bound' et
'assignment' sont traités comme des synonymes.
Ne serait-il pas préférable d'avoir :
UnboundLocalError: local variable 'toto' referenced before binding
ou
UnassignedLocalError: local variable 'toto' referenced before assignment
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
1) Les variables w,x,y,z sont accessibles en "lecture" depuis la
fonction f, meme si elles ne sont pas declarees globales.
2) Les variables complexes (dictionnaire ou tableau) y et z semblent
modifiables meme si non declarees globales.
3) Par contre, w et x (respectivement entier et chaine)
ne sont modifiables que si declarees globales (exception levee dans le
cas contraire)
Je n'ai jamais su trouver dans la doc l'explication de cette
difference de comportement entre variables "simples et complexes"
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
1) Les variables w,x,y,z sont accessibles en "lecture" depuis la
fonction f, meme si elles ne sont pas declarees globales.
2) Les variables complexes (dictionnaire ou tableau) y et z semblent
modifiables meme si non declarees globales.
3) Par contre, w et x (respectivement entier et chaine)
ne sont modifiables que si declarees globales (exception levee dans le
cas contraire)
Je n'ai jamais su trouver dans la doc l'explication de cette
difference de comportement entre variables "simples et complexes"
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
1) Les variables w,x,y,z sont accessibles en "lecture" depuis la
fonction f, meme si elles ne sont pas declarees globales.
2) Les variables complexes (dictionnaire ou tableau) y et z semblent
modifiables meme si non declarees globales.
3) Par contre, w et x (respectivement entier et chaine)
ne sont modifiables que si declarees globales (exception levee dans le
cas contraire)
Je n'ai jamais su trouver dans la doc l'explication de cette
difference de comportement entre variables "simples et complexes"
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
dictionnaire) dont la "référence" ne change pas, mais dont on p eut
modifier le "contenu", sans creer un nouvel objet.
Pour les chaines le fonctionnement pourrait être identique, mais les
string python sont non modifiables par choix d'implementation.
De même, si x était une instance de classe X, on pourrait en mo difier
les attributs, sans modifier pour autant la variable qui référe nce
l'objet en question.
Par ex:
x = Personne ()
def f():
x.name = "toto"
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
dictionnaire) dont la "référence" ne change pas, mais dont on p eut
modifier le "contenu", sans creer un nouvel objet.
Pour les chaines le fonctionnement pourrait être identique, mais les
string python sont non modifiables par choix d'implementation.
De même, si x était une instance de classe X, on pourrait en mo difier
les attributs, sans modifier pour autant la variable qui référe nce
l'objet en question.
Par ex:
x = Personne ()
def f():
x.name = "toto"
w = 1
x = "toto"
y = []
z = {}
def f():
print "w = ", w
# w = w +1 => erreur
print "x = ", x
# x = x + "!" => erreur
print "y = ", y
y.append ("toto") # ok
print "z = ", z
z ["x"] = "toto" # ok
f()
Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
dictionnaire) dont la "référence" ne change pas, mais dont on p eut
modifier le "contenu", sans creer un nouvel objet.
Pour les chaines le fonctionnement pourrait être identique, mais les
string python sont non modifiables par choix d'implementation.
De même, si x était une instance de classe X, on pourrait en mo difier
les attributs, sans modifier pour autant la variable qui référe nce
l'objet en question.
Par ex:
x = Personne ()
def f():
x.name = "toto"
Alain BARTHE writes:
>>> w = 1
>>> x = "toto"
>>> y = []
>>> z = {}
>>> def f():
>>> print "w = ", w
>>> # w = w +1 => erreur
>>> print "x = ", x
>>> # x = x + "!" => erreur
>>> print "y = ", y
>>> y.append ("toto") # ok
>>> print "z = ", z
>>> z ["x"] = "toto" # ok
>>> f()
> Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
> dictionnaire) dont la "référence" ne change pas, mais dont on peut
> modifier le "contenu", sans creer un nouvel objet.
C'est cela, mais, juste pour être précis : y et z ne sont pas des
objets, juste des noms qui désignent des objets. (Il pourrait d'ailleur s
y avoir plusieurs noms pour le même objet. Et certains noms pourraient
être locaux et d'autres globaux. Par exemple :
l = [1,2]
def f():
l1 = l
l1.append(3)
print l
Deux noms, un objet.)
> Pour les chaines le fonctionnement pourrait être identique, mais les
> string python sont non modifiables par choix d'implementation.
Oui. D'ailleurs les objets importent peu ici (ils sont toujours
globalement accessibles, tant qu'on a un nom pour les désigner) : ce qu i
provoque les éventuelles erreurs sont les noms utilisés/affectés.
> De même, si x était une instance de classe X, on pourrait en modifi er
> les attributs, sans modifier pour autant la variable qui référence
> l'objet en question.
> Par ex:
> x = Personne ()
> def f():
> x.name = "toto"
Exactement (et aucune ambiguité sur name ici, puisqu'on sait où le
chercher).
-- Alain.
Alain BARTHE <alain.bar...@cesr.fr> writes:
>>> w = 1
>>> x = "toto"
>>> y = []
>>> z = {}
>>> def f():
>>> print "w = ", w
>>> # w = w +1 => erreur
>>> print "x = ", x
>>> # x = x + "!" => erreur
>>> print "y = ", y
>>> y.append ("toto") # ok
>>> print "z = ", z
>>> z ["x"] = "toto" # ok
>>> f()
> Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
> dictionnaire) dont la "référence" ne change pas, mais dont on peut
> modifier le "contenu", sans creer un nouvel objet.
C'est cela, mais, juste pour être précis : y et z ne sont pas des
objets, juste des noms qui désignent des objets. (Il pourrait d'ailleur s
y avoir plusieurs noms pour le même objet. Et certains noms pourraient
être locaux et d'autres globaux. Par exemple :
l = [1,2]
def f():
l1 = l
l1.append(3)
print l
Deux noms, un objet.)
> Pour les chaines le fonctionnement pourrait être identique, mais les
> string python sont non modifiables par choix d'implementation.
Oui. D'ailleurs les objets importent peu ici (ils sont toujours
globalement accessibles, tant qu'on a un nom pour les désigner) : ce qu i
provoque les éventuelles erreurs sont les noms utilisés/affectés.
> De même, si x était une instance de classe X, on pourrait en modifi er
> les attributs, sans modifier pour autant la variable qui référence
> l'objet en question.
> Par ex:
> x = Personne ()
> def f():
> x.name = "toto"
Exactement (et aucune ambiguité sur name ici, puisqu'on sait où le
chercher).
-- Alain.
Alain BARTHE writes:
>>> w = 1
>>> x = "toto"
>>> y = []
>>> z = {}
>>> def f():
>>> print "w = ", w
>>> # w = w +1 => erreur
>>> print "x = ", x
>>> # x = x + "!" => erreur
>>> print "y = ", y
>>> y.append ("toto") # ok
>>> print "z = ", z
>>> z ["x"] = "toto" # ok
>>> f()
> Si j'ai bien compris y et z sont des objets "conteneurs" (tableau et
> dictionnaire) dont la "référence" ne change pas, mais dont on peut
> modifier le "contenu", sans creer un nouvel objet.
C'est cela, mais, juste pour être précis : y et z ne sont pas des
objets, juste des noms qui désignent des objets. (Il pourrait d'ailleur s
y avoir plusieurs noms pour le même objet. Et certains noms pourraient
être locaux et d'autres globaux. Par exemple :
l = [1,2]
def f():
l1 = l
l1.append(3)
print l
Deux noms, un objet.)
> Pour les chaines le fonctionnement pourrait être identique, mais les
> string python sont non modifiables par choix d'implementation.
Oui. D'ailleurs les objets importent peu ici (ils sont toujours
globalement accessibles, tant qu'on a un nom pour les désigner) : ce qu i
provoque les éventuelles erreurs sont les noms utilisés/affectés.
> De même, si x était une instance de classe X, on pourrait en modifi er
> les attributs, sans modifier pour autant la variable qui référence
> l'objet en question.
> Par ex:
> x = Personne ()
> def f():
> x.name = "toto"
Exactement (et aucune ambiguité sur name ici, puisqu'on sait où le
chercher).
-- Alain.
Tiens, encore plus rigolo:
def f(x, l):
x += 1
l += [1]
x, l = 0, []
f(x, l)
print x, l
Pas de problème global/local ici, mais on reste dans les problè mes de
bindings, de références et d'objets référencés.
Tiens, encore plus rigolo:
def f(x, l):
x += 1
l += [1]
x, l = 0, []
f(x, l)
print x, l
Pas de problème global/local ici, mais on reste dans les problè mes de
bindings, de références et d'objets référencés.
Tiens, encore plus rigolo:
def f(x, l):
x += 1
l += [1]
x, l = 0, []
f(x, l)
print x, l
Pas de problème global/local ici, mais on reste dans les problè mes de
bindings, de références et d'objets référencés.
Alain Ketterlin a écrit :
(snip)
> UnboundLocalError: local variable 'toto' referenced before assignmentTu oublies "local" : puisque la variable est locale et qu'elle est
"unbound", ça veut dire qu'il manque un "assignement" (la seule for me de
binding possible pour une variable locale).
Les arguments de la fonctions sont également des variables locales,
donc il y a deux formes de binding possibles pour une locale !-)
Alain Ketterlin a écrit :
(snip)
> UnboundLocalError: local variable 'toto' referenced before assignment
Tu oublies "local" : puisque la variable est locale et qu'elle est
"unbound", ça veut dire qu'il manque un "assignement" (la seule for me de
binding possible pour une variable locale).
Les arguments de la fonctions sont également des variables locales,
donc il y a deux formes de binding possibles pour une locale !-)
Alain Ketterlin a écrit :
(snip)
> UnboundLocalError: local variable 'toto' referenced before assignmentTu oublies "local" : puisque la variable est locale et qu'elle est
"unbound", ça veut dire qu'il manque un "assignement" (la seule for me de
binding possible pour une variable locale).
Les arguments de la fonctions sont également des variables locales,
donc il y a deux formes de binding possibles pour une locale !-)