为什么分配给我的全局variables在Python中不起作用?
我在尝试理解python范围规则方面遇到了很大的麻烦。
用以下脚本:
a = 7 def printA(): print "Value of a is %d" % (a) def setA(value): a = value print "Inside setA, a is now %d" %(a) print "Before setA" printA() setA(42) print "After setA" printA()
给我意想不到的(给我)输出:
setA之前 a的值是7 在setA里,a现在是42 setA后 a的值是7
在哪里我期望a的值的最后一次打印是42,而不是7.我错过了关于全局variables范围的Python范围规则?
全局variables是特殊的。 如果您尝试在函数内部赋值variablesa = value
,则会在函数内部创build一个新的局部variables,即使存在具有相同名称的全局variables也是如此。 要改为访问全局variables,请在函数内添加一个global
语句 :
a = 7 def setA(value): global a # declare a to be a global a = value # this sets the global value of a
有关Python的命名和绑定规则的详细解释,另请参阅命名和绑定。
理解这一点的技巧是,当你赋值给一个variables时,使用=,你也可以将它声明为局部variables。 因此,而不是改变全局variablesa的值,setA(value)实际上设置一个局部variables(恰好被称为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) 在setA文件“scopeTest.py”,第7行 打印“在分配之前,a是%d”%(a) UnboundLocalError:赋值之前引用的局部variables“a”
这告诉我们Python已经决定了setA(value)函数有一个局部variables叫做a,当你在函数中赋值的时候,你改变了它。 如果你不在函数中赋值(和printA()一样),那么Python使用全局variablesA.
要将variables标记为全局variables,您需要在Python中使用全局关键字, 在要使用全局variables的范围内 。 在这种情况下,在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)函数中的variablesa时,你正在谈论全局variables,而不是局部variables。
Python没有其他语言的variables的概念。 你有对象是“某处”,并且你有这些对象的引用。 =用于将这些对象分配给当前名称空间中的引用。
您在setA函数的名称空间中创build一个名称a,它指向值所引用的对象。
在函数内部, a被视为局部variables,你需要定义
全球性的
里面的function