为什么我无法在Python中设置全局变量?

39 投票
4 回答
61232 浏览
提问于 2025-04-15 13:37

在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。

撰写回答