Pourquoi diable Python permet de changer la liste déclarée globale en fonction?Pourquoi changer global ne donne pas d'erreur?
réactualisées
numbers = []
num = 4
def add(n, thisnum=None):
# changing global list without global declaration!
numbers.append(n)
if thisnum:
num = thisnum
print 'num assigned', thisnum
##numbers = ('one', 'two', 'three')
## adding this line makes error:
"""Traceback (most recent call last):
File "J:\test\glob_vals.py", line 13, in <module>
add(i)
File "J:\test\glob_vals.py", line 6, in add
numbers.append(n)
UnboundLocalError: local variable 'numbers' referenced before assignment
"""
for i in (1,2,3,564,234,23):
add(i)
print numbers
add(10, thisnum= 19)
# no error
print num
# let the fun begin
num = [4]
add(10, num)
print num
# prints:
"""[1, 2, 3, 56, 234, 23]
num assigned 19
4
num assigned [4]
[4]
"""
Si je mets assignement à la variable avec le même nom alors l'action avant cette ligne devient erreur, pas la ligne ajoutée (octet points du compilateur de code, je suppose).
Vous semblez être confus au sujet des règles de portée. Il y a quelques questions à ce sujet avec des réponses de qualité réparties à travers SO, et docs.python.org couvre également cela. – delnan
Je pense toujours que ce n'est pas chose triviale ou évidente de la documentation que j'ai étudiée beaucoup, étant enseignant et étudié l'informatique depuis 1984. –
Je pense que c'est simple - peut-être plus complexe que les règles de portée dans la plupart des langues, mais toujours poignée de règles sans mauvaises exceptions. – delnan