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

39

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

这样写在Python中是无效的:

G = None

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

foo()

我遇到了一个错误:

UnboundLocalError: local variable 'G' referenced before assignment

我做错了什么?


可能是在函数中使用全局变量的重复问题。 - Abu Shoeb
4个回答

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。


s/variables/names/g s/assign to/bind to/g - Ned Deily
1
是的,可以使用不同的术语,但只要Python本身在错误消息中谈论“变量”和“赋值”(如原问题所示),我认为在解释问题时使用这种术语是完全可接受的。 - Greg Hewgill
明白了!关于这个问题,语言参考文档也并不总是一致的。 - Ned Deily

10
你需要将G声明为global,但是为什么呢?因为在函数内部引用变量时,如果你在该函数的任何地方进行了变量的赋值,Python 就会认为它是一个局部变量。所以如果此时在代码中不存在同名的局部变量,就会出现UnboundLocalError的报错。如果你实际上想引用全局变量(正如你在问题中所述),你需要使用global关键字告诉 Python 这就是你想要的。
如果你在函数中没有对变量进行赋值,而只是访问其值,那么如果存在同名的全局变量,Python 就会使用该全局变量的值。因此,你可以这样做:
G = None

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

foo()

这段代码打印出None,并且不会引发UnboundLocalError错误。


9

你仍然需要在该函数内声明G为全局变量:

G = None

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

foo()
print G

这仅仅输出

1

2

像这样在函数中将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接