理解这一点的技巧是,当您使用=分配给变量时,还需要将其声明为局部变量。因此,setA(value)不会更改全局变量a的值,而是实际上将一个局部变量(碰巧称为a)设置为传入的值。
如果您尝试像这样在setA(value)的开头打印a的值,这将变得更加明显:
def setA(value):
print "Before assignment, a is %d" % (a)
a = value
print "Inside setA, a is now %d" % (a)
如果您尝试运行此Python,则会给您一个有用的错误:
追溯(最近一次通话):
文件“ scopeTest.py”,第14行,在
setA(42)
setA中的文件“ scopeTest.py”,第7行
打印“分配前,a为%d”%(a)
UnboundLocalError:赋值之前引用了局部变量“ a”
这告诉我们Python已确定setA(value)函数具有一个称为a的局部变量,这是在函数中为其分配时所更改的。如果您未在函数中分配给a(与printA()一样),则Python使用全局变量A。
要将变量标记为全局变量,您需要在Python中要使用global variable的范围内使用global关键字。在这种情况下,它位于setA(value)函数中。因此,脚本变为:
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,在setA(value)函数中使用变量a时,您所谈论的是全局变量,而不是局部变量。