关于python中的全局关键字

时间:2012-04-13 10:09:46

标签: python

# 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),为什么?

3 个答案:

答案 0 :(得分:5)

这里的诀窍是静态检测本地名称

  • 只要未在函数中指定名称x,对x的引用就会解析为全局范围
  • 如果在函数中将名称x分配为任何地方,则Python会假定x因此是函数中的本地名称无处不在。因此,第一行变为错误,因为在分配之前使用了本地名称x

换句话说:分配的名称在函数中的所有位置都被视为本地,而不仅仅是在赋值之后。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

Python使用相当典型的variable scoping。非局部变量在函数中可见。

如果要分配给全局范围内的变量,则只需要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 (which is the value of x in local scope of中分配的{(1}} x`在全局范围内保持不变。

值得注意的是,Python使用词法(静态)作用域,因此遵循代码修改全局作用域中的), while value of

x