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

33 python global-variables

全局变量如何在Python中运行?我知道全局变量是邪恶的,我只是在尝试.

这在python中不起作用:

G = None

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

foo()
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

UnboundLocalError: local variable 'G' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Gre*_*ill 63

你需要global声明:

def foo():
    global G
    if G is None:
        G = 1
Run Code Online (Sandbox Code Playgroud)

在Python中,默认情况下,您指定的变量成为局部变量.您需要使用global它们将它们声明为全局变量.另一方面,您引用但未分配的变量不会自动成为局部变量.这些变量引用封闭范围中最近的变量.

Python 3.x引入了nonlocal类似的语句global,但将变量绑定到最近的封闭范围.例如:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x
Run Code Online (Sandbox Code Playgroud)

调用时,此函数返回10.


Dav*_*d Z 9

你需要声明Gas global,但是为什么:每当你在函数内部引用变量时,如果你在该函数中的任何地方设置变量,Python就假定它是一个局部变量.因此,如果代码中的那个点上不存在该名称的局部变量,那么您将得到UnboundLocalError.如果你真的想要引用一个全局变量,就像你的问题一样,你需要global关键字来告诉Python你的意思.

如果您没有在函数中的任何位置分配变量,而只访问其值,Python将使用该名称的全局变量(如果存在).所以你可以这样做:

G = None

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

foo()
Run Code Online (Sandbox Code Playgroud)

此代码打印None并不会抛出UnboundLocalError.


Mar*_*off 8

您仍然必须在该函数中将G声明为全局:

G = None

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

foo()
print G
Run Code Online (Sandbox Code Playgroud)

这只是输出

1
Run Code Online (Sandbox Code Playgroud)