# 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
global x
,但它仍然可以找到x
为50,为什么?x=2
行时,会出现错误(UnboundLocalError: local variable 'x' referenced before assignment
),为什么?答案 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