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. 我没有添加global xin func函数,但它仍然可以找到x是50,为什么?
  2. 当我x=2在func函数中添加该行时,会出现错误(UnboundLocalError: local variable 'x' referenced before assignment),为什么?
4

3 回答 3

5

这里的技巧是静态检测本地名称

  • 只要名称x未在函数中分配,引用即可x解析为全局范围
  • 如果该名称在函数中的任何位置x分配,Python 假定它是函数中任何地方的本地名称。结果,第一行成为错误,因为在分配之前使用了本地名称。xx

换句话说:分配的名称在函数中的任何地方都被视为本地,而不仅仅是在分配点之后。

于 2012-04-13T10:31:44.417 回答
4

global关键字只需要写入全局变量。

存在错误,因为分配给未声明为全局的变量会创建该名称的局部变量。您在分配之前在该范围内引用x它,因此您试图读取尚未分配的局部变量。

于 2012-04-13T10:12:56.437 回答
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()上述代码后,将在全局范围内打印 'assigned in g (which is the value ofx in local scope off() x'), while value of保持不变。

还值得注意的是,Python 使用词法(静态)范围,因此以下代码不会修改全局x范围内的 :

x = 'global'
def f():
    x = 'local in f'
    def g():
        nonlocal x 
        x = 'assigned in g'
    return g
g = f()
g()
于 2012-04-13T10:16:19.070 回答