闭包
def a(x):
print(x)
def b(y):
print(y)
return x*y
return b
像b这样存储其所在作用域的函数称为闭包。
在这里,一个函数位于另一个函数中,且外面的函数返回里面的函数。也就是返回一个函数,而不是调用它。
重要的是,返回的函数能够访问其定义所在的作用域。
可以看出n是代表b函数,
并且我们调用n(也就是调用b函数)时
n(b函数)可以访问a()里面的参数x,以及局部变量z
id() 函数 Python 内置函数 描述 id() 函数返回对象的唯一标识符
在这里,我们想使用b()函数修改a中参数x与局部变量z的值,
但是发现程序默认新生成两个b()函数的局部变量
就是说a函数的x,z与b函数的不是一个变量,
从id可以看出来
这时就要用到nonlocal关键字了
这个关键字的用法与global很像,
让你能够给外部作用域(非全局作用域)内的变量赋值。
nonlocal的使用要先声明 nonlocal 变量名
之后才能用于赋值等操作
可以发现,当我们用到nonlocal x
我们修改的值正是a()函数的值,
而b函数里z的赋值,并没有影响到a()函数里的z值,
a(),b()里两个z并不是一个变量