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

问题描述 投票:0回答:4

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

这在Python中不起作用:

G = None

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

foo()

我收到错误:

UnboundLocalError: local variable 'G' referenced before assignment

我做错了什么?

python global-variables
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。


10
投票
您需要将

G

 声明为 
global
,但至于原因:每当您在函数内引用变量时,如果您在该函数中的任何位置 
set 该变量,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

© www.soinside.com 2019 - 2024. All rights reserved.