理解这一点的诀窍是,当您使用 = 分配给变量时,您还将其声明为局部变量。因此,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 行,在
设置A(42)
文件“scopeTest.py”,第 7 行,在 setA 中
print "赋值前,a 为 %d" % (a)
UnboundLocalError:分配前引用的局部变量“a”
这告诉我们 Python 已经决定 setA(value) 函数有一个称为 a 的局部变量,当您在函数中分配给它时,您会更改它。如果您没有在函数中分配 a(如 printA()),那么 Python 将使用全局变量 A。
要将变量标记为全局变量,您需要在 Python 中使用 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 时,您正在谈论的是全局变量,而不是局部变量。