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

时间:2009-08-15 04:49:48

标签: python global-variables

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

这在python中不起作用:

G = None

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

foo()

我收到错误:

UnboundLocalError: local variable 'G' referenced before assignment

我做错了什么?

4 个答案:

答案 0 :(得分:62)

您需要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.

答案 1 :(得分:9)

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

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

G = None

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

foo()

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

答案 2 :(得分:7)

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

G = None

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

foo()
print G

只输出

1

答案 3 :(得分: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