nonlocal - 用于操作外层作用域中的对象。
Topic source请教一下如下代码中: def createCounter(): fs = [0] def counter(): fs[0] = fs[0] + 1 return fs[0] return counter 为什么这里内部函数一样使用了外部函数的变量列表fs,却没有报错。
@是我_也不是我 我猜是因为fs[0]=fs[0]+1 是修改列表中的第一个值,并没有重新给fs 赋值,fs不会被当做新的局部变量来初始化。 如果改成 fs=[fs[0]+1] 就会报错。
def createCounter(): fs = [0] def counter(): fs=[fs[0]+1] return fs[0] return counter
Python有个奇怪的特性:
def outer():
x = 1
def inner():
y = x + 1
print('y=', y) # y=2
inner()
print('x=', x) # x=1
如果inner()引用了x,但没有对x赋值,那么x就会自动查找外层作用域,即x的值为1
但是,如果inner()中有对x的赋值语句:
def outer():
x = 1
def inner():
x = 2
print('inner x:', x) # 2
inner()
print('outer x:', x) # 1
Python解释器会把x解释为inner()的局部变量,也就是outer的x和inner的x互不影响
但是!
如果在inner()中加上y=x+1:
def outer():
x = 1
def inner():
y = x + 1 # UnboundLocalError: local variable 'x' referenced before assignment
x = 2
print('inner x:', x) # 2
inner()
print('outer x:', x) # 1
会报错UnboundLocalError,因为Python解释器把inner()的x解释为inner()的局部变量,但是x还没有被赋值,无法计算x+1
这个时候唯一的方法是用nonlocal x告诉解释器,inner()引用的x不是新的局部变量,而是outer的x:
def outer():
x = 1
def inner():
nonlocal x
y = x + 1
x = 2
print('inner x:', x) # 2
inner()
print('outer x:', x) # 2
所以通常情况下不要在内部函数中对外部作用域的变量重新赋值。
通常情况下不应该在内部函数中修改外层作用域的值,所以很少会用到nonlocal
实在想修改怎么办?最好是返回一个新的值,然后让外层自己改:
def outer():
x = 1
def inner():
return x + 1
x = inner()
print(x) # 2
- 1
Nathan_Hu_
nonlocal
在 Python 中,内层函数对外层作用域中的变量仅有只读访问权限!
而 nonlocal 可以使我们自由地操作外层作用域中的变量!