关于Python中的global关键字

3
# coding: utf-8

def func():
    print 'x is', x
    #x = 2   #if I add this line, there will be an error, why?
    print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x 
  1. 在func函数中,我没有加入global x,但是它仍然可以找到x等于50,为什么?
  2. 当我在func函数中添加x=2这一行时,就会出现错误(UnboundLocalError: local variable 'x' referenced before assignment),为什么?

@Marcin 如果我添加 x = 2,错误会是“UnboundLocalError:在赋值之前引用了本地变量'x'”。 - Tanky Woo
然后将其放入您的问题中。 - Marcin
3个回答

5
这里的诀窍在于局部名称是静态检测的
  • 只要函数中没有给变量名x赋值,对x的引用就会解析到全局作用域
  • 如果函数中任何位置都给变量名x赋值了,Python 就认为x是该函数中任何位置的局部名称。因此,第一行代码出现错误,因为在赋值之前使用了局部名称x
换句话说:被赋值的名称在函数中任何位置都被视为局部名称,而不仅仅是在赋值点后面。

4

global 关键字只需要在写入全局变量时使用。

出现错误是因为对未声明为全局的变量进行赋值会创建该名称的本地变量。您在分配给它之前在该范围内引用 x,因此您正在尝试读取尚未分配的本地变量。


3
Python使用相当典型的变量作用域。非局部变量在函数内可见。
只有在全局作用域内分配变量时才需要global关键字。还要注意全局作用域和外部作用域之间的区别。考虑影响:
x = 'global'
def f():
    x = 'local in f'
    def g():
        global x 
        x = 'assigned in g'
    g()
    print x

执行上述代码中的f()后,代码将打印local in f,而全局范围中的x被设置为'assigned in g'
自 Python 3 开始,还有一个名为 nonlocal 的关键字,它允许您从外部作用域分配给变量。
x = 'global'
def f():
    x = 'local in f'
    def g():
        nonlocal x 
        x = 'assigned in g'
    return g
    print(x)

执行上述代码中的f()后,代码将打印“在g中分配(这是f()本地范围内的x的值),而全局范围内的x的值保持不变。”
值得注意的是,Python使用词法(静态)作用域,因此以下代码不会修改全局范围内的x
x = 'global'
def f():
    x = 'local in f'
    def g():
        nonlocal x 
        x = 'assigned in g'
    return g
g = f()
g()

1
如果你想讨论技术上的优缺点,要以建设性和成熟的方式进行。不要陷入幼稚的互相辱骂和斗争中。谢谢。 - BoltClock
@BoltClock'saUnicorn,我在这个答案中没有看到你提到的不尊重。哦..等一下(查英语词典找“typical”),啊..在那里 - 看起来这个词在英语中有负面含义,在其他语言中则没有 - Vartec作为非母语人士可能没有意识到这一点。"""1.作为某种类型的代表性例子或服务; 具有特征性的绘画是典型的伦勃朗2.被认为是某些不良特征的例子,这是你的典型!"""}(柯林斯词典)- 在世界各地,第一个意思更为普遍 - jsbueno
@jsbueno:嗯,这并不是答案的问题...还有其他原因。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接