请考虑以下示例:
def g():
in_g=100
def f1():
nonlocal in_g
in_g = 10
def f2():
nonlocal in_g
print(in_g)
return (f1,f2)
(f1, f2) = g()
f2() #prints 100
f1()
f2() #prints 10
内部函数 f1
和 f2
在其"closures"中都有权访问变量 in_g
. 但是,在 g
返回后, in_g
保存在内存中?
我假设 g
正在执行时, in_g
是堆栈帧上的一个变量,对应于对 g
的调用 . 因此, g
, f1
和 f2
在使用变量 in_g
时都访问相同的内存位置(在堆栈上) .
但是,如示例所示,在 g
返回后, f1
和 f2
在引用 in_g
时仍然访问相同的内存位置 . 但是,现在 g
返回,该内存位置不再在堆栈中 .
2 回答
上面代码的输出是100和10 .
因为第一个f2()调用所以它直接访问in_g变量并打印它的值 . 在f1()之后调用&它将in_g变量值更新为10.然后f2()函数再次调用,因为非本地语句它绑定了之前的 Value 就是它打印10值的原因 .
nonlocal statement 导致列出的标识符引用最近的封闭范围中除了全局变量之前绑定的变量 . 这很重要,因为绑定的默认行为是首先搜索本地名称空间 . 除了全局(模块)范围之外,该语句还允许封装代码重新绑定局部范围之外的变量 . 与非全局语句中列出的名称不同,非本地语句中列出的名称必须引用封闭范围中的预先存在的绑定(无法明确确定应创建新绑定的范围) . 非本地语句中列出的名称不得与本地作用域中的预先存在的绑定冲突 .
我相信我在这里找到了答案:http://stupidpythonideas.blogspot.ro/2015/12/how-lookup-works.html .
因此,当访问
in_g
时,g
,f1
和f2
访问cell variable
,而cell variable
依次保存对实际对象的引用 .