如何在嵌套闭包中确定自由变量值?
How free variable value is determined within nested closure?
我创建了一个 nested closure
,如下所示:
def incrementer(n):
def inner(start):
current = start
def inc():
nonlocal current
current += n
return current
return inc
return inner
fn = incrementer(2)
现在,当我为 fn
打印 co_freevars
的值时,我得到以下输出:
print(fn.__code__.co_freevars) -> ('n',)
我的理解是应该是('current', 'n')
因为有2 free variables
这里。
为什么 print(fn.__code__.co_freevars)
没有打印 ('current', 'n')
?
你在inner
中定义了current
,所以它在那里是一个普通的局部变量。 current
是 inc
中的闭包变量。
考虑:
inner = incrementer(2)
inc = inner(1)
print(inner.__code__.co_freevars)
print(inc.__code__.co_freevars)
输出:
('n',)
('current', 'n')
再举个例子:
def outer():
var1 = 1
var2 = 2
var3 = 3
var4 = 4
def middle():
var1
var2
def inner():
var2
var4
return inner
return middle
middle = outer()
inner = middle()
print(outer.__code__.co_freevars)
print(middle.__code__.co_freevars)
print(inner.__code__.co_freevars)
输出:
()
('var1', 'var2', 'var4')
('var2', 'var4')
第一次打印:
outer
没有闭包变量。
第二次打印:
var1
、var2
和 var4
用于 middle
并且来自外部作用域。是的,var4
用在了middle
中。在inner
的定义中,是在middle
.
里面定义的
第三次打印:
var2
和 var4
在 inner
中使用并且来自外部作用域。
我创建了一个 nested closure
,如下所示:
def incrementer(n):
def inner(start):
current = start
def inc():
nonlocal current
current += n
return current
return inc
return inner
fn = incrementer(2)
现在,当我为 fn
打印 co_freevars
的值时,我得到以下输出:
print(fn.__code__.co_freevars) -> ('n',)
我的理解是应该是('current', 'n')
因为有2 free variables
这里。
为什么 print(fn.__code__.co_freevars)
没有打印 ('current', 'n')
?
你在inner
中定义了current
,所以它在那里是一个普通的局部变量。 current
是 inc
中的闭包变量。
考虑:
inner = incrementer(2)
inc = inner(1)
print(inner.__code__.co_freevars)
print(inc.__code__.co_freevars)
输出:
('n',)
('current', 'n')
再举个例子:
def outer():
var1 = 1
var2 = 2
var3 = 3
var4 = 4
def middle():
var1
var2
def inner():
var2
var4
return inner
return middle
middle = outer()
inner = middle()
print(outer.__code__.co_freevars)
print(middle.__code__.co_freevars)
print(inner.__code__.co_freevars)
输出:
()
('var1', 'var2', 'var4')
('var2', 'var4')
第一次打印:
outer
没有闭包变量。
第二次打印:
var1
、var2
和 var4
用于 middle
并且来自外部作用域。是的,var4
用在了middle
中。在inner
的定义中,是在middle
.
第三次打印:
var2
和 var4
在 inner
中使用并且来自外部作用域。