为什么我不能在 Python 中设置全局变量?

Why can't I set a global variable in Python?

提问人: 提问时间:8/15/2009 最后编辑:Eric Leschinski 更新时间:12/2/2018 访问量:60402

问:

全局变量在 Python 中如何工作?我知道全局变量是邪恶的,我只是在实验。

这在 python 中不起作用:

G = None

def foo():
    if G is None:
        G = 1

foo()

我收到错误:

UnboundLocalError: local variable 'G' referenced before assignment

我做错了什么?

Python 全局变量

评论

0赞 Abu Shoeb 12/17/2018
在函数中使用全局变量的可能重复项

答:

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 这就是你的意思。GglobalUnboundLocalErrorglobal

如果您没有将变量赋值给函数中的任何位置,而只访问其值,则 Python 将使用该名称的全局变量(如果存在)。因此,您可以执行以下操作:

G = None

def foo():
    if G is None:
        print G

foo()

此代码将打印,并且不会引发 UnboundLocalError。None