为什么我无法在Python中设置全局变量?
在Python中,全局变量是怎么运作的?我知道全局变量不好,但我只是想试试。
这个在Python中是行不通的:
G = None
def foo():
if G is None:
G = 1
foo()
我遇到了一个错误:
UnboundLocalError: local variable 'G' referenced before assignment
我哪里做错了?
4 个回答
9
你还是需要在那个函数里面把G声明为全局变量:
G = None
def foo():
global G
if G is None:
G = 1
foo()
print G
这段代码的输出就是:
1
10
你需要把 G
声明为 global
,那么为什么呢?因为每当你在一个函数里提到一个变量,如果你在这个函数里给这个变量赋值,Python 就会认为这个变量是局部的。所以如果在代码的那个地方没有找到同名的局部变量,你就会遇到 UnboundLocalError
的错误。如果你其实是想用全局变量,就像你问题里提到的那样,你需要用 global
这个关键词来告诉 Python 你是这个意思。
如果你在函数里没有给这个变量赋值,只是想用它的值,Python 会使用同名的全局变量(如果存在的话)。所以你可以这样做:
G = None
def foo():
if G is None:
print G
foo()
这段代码会打印出 None
,并且不会抛出 UnboundLocalError 的错误。
72
你需要使用 global
这个语句:
def foo():
global G
if G is None:
G = 1
在Python中,默认情况下,你赋值的变量会变成局部变量。也就是说,如果你在一个函数里给一个变量赋值,它就只在这个函数里有效。如果你想让这个变量在整个程序中都能用,就需要用 global
来声明它是全局变量。另一方面,如果你只是引用了一个变量,但没有给它赋值,那么这个变量不会自动变成局部变量。它会指向最近的一个外层作用域中的变量。
Python 3.x 还引入了 nonlocal
这个语句,它和 global
类似,但它会把变量绑定到最近的外层作用域。例如:
def foo():
x = 5
def bar():
nonlocal x
x = x * 2
bar()
return x
这个函数被调用时会返回10。