为什么分配给我的全局变量在Python不行?
-
06-09-2019 - |
题
我有可怕的麻烦试图了解蟒蛇作用域规则。
使用下面的脚本:
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()
给出意想不到(我)的输出:
Before setA Value of a is 7 Inside setA, a is now 42 After setA Value of a is 7
在哪里我期望的值的最后一个印刷是42,而不是7。我错过了Python的作用域规则的全局变量的作用域?
解决方案
全局变量是特殊的。如果你试图给一个变量a = value
在函数中,它会创建函数内一个新的局部变量,即使有相同名称的全局变量。若要改为访问全局变量,添加 global
语句内功能:
a = 7
def setA(value):
global a # declare a to be a global
a = value # this sets the global value of a
请参阅也命名和结合 Python的命名和绑定规则。
其他提示
在特技理解这是因为当分配给一个变量,使用=,还声明为一个局部变量。因此,而不是改变所述全局变量a的值,组A(值)实际上设置局部变量(恰好被称为),以在传递的值。
如果你试图从组A(值),像这样的开始打印的价值,这一点就更明显
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已经决定了组A(值)函数有一个叫做局部变量,这是当你分配给它的功能你改变什么。如果不分配给在函数(与printA())然后Python使用全局变量A
要标记为全球需要使用Python中的全球关键字的变量,中要使用全局变量的范围。在这种情况下是组A(值)函数内。因此,字迹变得:
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(值)函数Python没有的变量作为其他语言的概念。你有哪些是“某处”的对象,你必须对这些对象的引用。 =用于对这些对象分配给在引用的电流的命名空间。
您在组A功能是指,其值是指所述对象的名称空间创建的名称的。
在函数内部,一被视为一个局部变量,需要定义结果
全球一个
该函数内
一个函数的执行引入用于该函数的局部变量新符号表。更确切地说,在一个函数的所有变量分配存储在本地符号表中的值;而变量引用先在局部符号表,然后在封闭函数的局部符号表,然后是全局符号表,终于在内置名称表。因此,全局变量不能直接分配的功能(除非在全局语句命名)的值,尽管它们可以被引用。