L'astuce pour comprendre ceci est que lorsque vous assignez à une variable, en utilisant =, vous la déclarez également comme variable locale. Ainsi, au lieu de modifier la valeur de la variable globale a, setA(value) définit en fait une variable locale (qui s'appelle a) à la valeur transmise.
Cela devient plus évident si vous essayez d'imprimer la valeur de a au début de setA(value) comme ceci :
def setA(value):
print "Before assignment, a is %d" % (a)
a = value
print "Inside setA, a is now %d" % (a)
Si vous essayez de l'exécuter, Python vous donnera une erreur utile :
Traceback (most recent call last):
File "scopeTest.py", line 14, in
setA(42)
File "scopeTest.py", line 7, in setA
print "Before assignment, a is %d" % (a)
UnboundLocalError: local variable 'a' referenced before assignment
Cela nous indique que Python a décidé que la fonction setA(value) possède une variable locale appelée a, qui est ce que vous modifiez lorsque vous l'assignez dans la fonction. Si vous n'assignez pas à a dans la fonction (comme avec printA()), Python utilise la variable globale A.
Pour marquer une variable comme globale, vous devez utiliser le mot-clé global en Python, dans la portée où vous voulez utiliser la variable globale . Dans ce cas, c'est à l'intérieur de la fonction setA(valeur). Donc le script devient :
a = 7
def printA():
print "Value of a is %d" % (a)
def setA(value):
global a
a = value
print "Inside setA, a is now %d" %(a)
print "Before setA"
printA()
setA(42)
print "After setA"
printA()
Cet ajout d'une ligne indique à Python que lorsque vous utilisez la variable a dans la fonction setA(value), vous parlez de la variable globale et non d'une variable locale.