Хитрость в понимании этого заключается в том, что когда вы присваиваете переменную, используя =, вы также объявляете ее как локальную переменную. Таким образом, вместо изменения значения глобальной переменной a, setA (значение) фактически устанавливает локальную переменную (которая называется a) значением, переданным в.
Это становится более очевидным, если вы попытаетесь напечатать значение a в начале setA (value) следующим образом:
def setA(value):
print "Before assignment, a is %d" % (a)
a = value
print "Inside setA, a is now %d" % (a)
Если вы попытаетесь запустить этот Python, появится полезная ошибка:
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
Это говорит нам о том, что Python решил, что функция setA (значение) имеет локальную переменную, которая называется a, и это то, что вы изменяете при назначении ей в функции. Если вы не присваиваете a в функции (как в printA ()), тогда Python использует глобальную переменную A.
Чтобы пометить переменную как глобальную, вам нужно использовать ключевое слово global в Python, в области, в которой вы хотите использовать глобальную переменную . В этом случае это внутри функции setA (значение). Таким образом, сценарий становится:
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()
Это добавление в одну строку сообщает Python, что когда вы используете переменную a в функции setA (значение), вы говорите о глобальной переменной, а не о локальной переменной.