提问人: 提问时间:8/15/2009 最后编辑:Eric Leschinski 更新时间:12/2/2018 访问量:60402
为什么我不能在 Python 中设置全局变量?
Why can't I set a global variable in Python?
问:
全局变量在 Python 中如何工作?我知道全局变量是邪恶的,我只是在实验。
这在 python 中不起作用:
G = None
def foo():
if G is None:
G = 1
foo()
我收到错误:
UnboundLocalError: local variable 'G' referenced before assignment
我做错了什么?
答:
72赞
Greg Hewgill
8/15/2009
#1
您需要全局
语句:
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。
评论
0赞
Ned Deily
8/15/2009
s/variables/names/g s/assign to/bind to/g
1赞
Greg Hewgill
8/15/2009
是的,可以使用不同的术语,但只要 Python 本身在错误消息中谈论“变量”和“赋值”(如原始问题中所示),我认为在解释问题时,这样的术语是完全可以接受的。
0赞
Ned Deily
8/15/2009
点了!在这个问题上,语言参考也并不总是一致的。
9赞
Mark Rushakoff
8/15/2009
#2
您仍然必须从该函数中将 G 声明为全局:
G = None
def foo():
global G
if G is None:
G = 1
foo()
print G
它只是输出
1
2赞
Nope
8/15/2009
#3
在函数中将 G 定义为全局,如下所示:
#!/usr/bin/python
G = None;
def foo():
global G
if G is None:
G = 1;
print G;
foo();
上面的python打印了.1
使用这样的全局变量是不好的做法,因为: http://c2.com/cgi/wiki?GlobalVariablesAreBad
10赞
David Z
8/15/2009
#4
你需要声明为 ,但至于原因:每当你引用函数中的变量时,如果你在该函数中的任何位置设置变量,Python 都会假设它是一个局部变量。因此,如果代码中不存在该名称的局部变量,则将获得 .如果你真的想引用一个全局变量,就像你的问题一样,你需要关键字来告诉 Python 这就是你的意思。G
global
UnboundLocalError
global
如果您没有将变量赋值给函数中的任何位置,而只访问其值,则 Python 将使用该名称的全局变量(如果存在)。因此,您可以执行以下操作:
G = None
def foo():
if G is None:
print G
foo()
此代码将打印,并且不会引发 UnboundLocalError。None
评论