Il fonctionne.
Maintenant si on enlève le commentaire, on obtient :
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:\Dev\python\win32\pywig\espacenom.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é ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michel Claveau - MVP
Re !
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
Bon, c'est un petit détail. Surtout que je parle pas anglais. Et puis, ce n'est pas important. Mais ça va me gâchee l'esprit jusqu'à l'apéro...
@+ -- Michel Claveau
Re !
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
Bon, c'est un petit détail. Surtout que je parle pas anglais.
Et puis, ce n'est pas important.
Mais ça va me gâchee l'esprit jusqu'à l'apéro...
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
Bon, c'est un petit détail. Surtout que je parle pas anglais. Et puis, ce n'est pas important. Mais ça va me gâchee l'esprit jusqu'à l'apéro...
Tu oublies "local" : puisque la variable est locale et qu'elle est "unbound", ça veut dire qu'il manque un "assignement" (la seule forme de binding possible pour une variable locale).
Tu oublies "local" : puisque la variable est locale et qu'elle est
"unbound", ça veut dire qu'il manque un "assignement" (la seule forme de
binding possible pour une variable locale).
Tu oublies "local" : puisque la variable est locale et qu'elle est "unbound", ça veut dire qu'il manque un "assignement" (la seule forme de binding possible pour une variable locale).
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"
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"
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"
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. Je ne demande pas d'explication, j'ai fini par comprendre pourquoi ça faisait ce que ça fait. Mais c'est quand même assez troublant Je subodore d'ailleurs que c'est ce genre de cas qui a fait que les opérateurs += et al ont mis si longtemps à être acceptés en Python.
On Apr 17, 3:18 pm, Alain Ketterlin <al...@dpt-info.u-strasbg.fr>
wrote:
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.
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. Je ne demande pas
d'explication, j'ai fini par comprendre pourquoi ça faisait ce que ça
fait. Mais c'est quand même assez troublant Je subodore d'ailleurs
que c'est ce genre de cas qui a fait que les opérateurs += et al ont
mis si longtemps à être acceptés en Python.
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. Je ne demande pas d'explication, j'ai fini par comprendre pourquoi ça faisait ce que ça fait. Mais c'est quand même assez troublant Je subodore d'ailleurs que c'est ce genre de cas qui a fait que les opérateurs += et al ont mis si longtemps à être acceptés en Python.
> 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).
> 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).
> 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).