为什么分配给我的全局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