Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能在Python中设置一个全局变量吗?_Python_Global Variables - Fatal编程技术网

为什么可以';我不能在Python中设置一个全局变量吗?

为什么可以';我不能在Python中设置一个全局变量吗?,python,global-variables,Python,Global Variables,全局变量在Python中是如何工作的?我知道全局变量是邪恶的,我只是在试验 这在python中不起作用: G = None def foo(): if G is None: G = 1 foo() 我得到一个错误: UnboundLocalError: local variable 'G' referenced before assignment 我做错了什么?你需要声明: def foo(): global G if G is None:

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

这在python中不起作用:

G = None

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

foo()
我得到一个错误:

UnboundLocalError: local variable 'G' referenced before assignment
我做错了什么?

你需要声明:

def foo():
    global G
    if G is None:
        G = 1
在Python中,默认情况下指定为局部变量的变量。您需要使用
global
将它们声明为全局变量。另一方面,引用但未指定的变量不会自动成为局部变量。这些变量指的是封闭范围内最近的变量

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

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

调用此函数时返回10。

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

G = None

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

foo()
print G
它只是输出

1

在函数中将G定义为全局,如下所示:

#!/usr/bin/python

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

foo();
上面的python打印
1


像这样使用全局变量是不好的做法,因为:

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

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

G = None

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

foo()

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

s/variables/names/gs/assign to/bind to/gYes,可以使用不同的术语,但只要Python本身在错误消息中谈到“variables”和“assignment”(如原始问题所示),我认为在解释这个问题时,这样的术语是完全可以接受的!语言参考在这件事上也不总是一致的