【发布时间】:2015-10-25 00:17:34
【问题描述】:
我在理解以下 sn-p 的结果时遇到了一点麻烦,我认为这是因为我对函数绑定感到困惑。为什么下面的 sn-ps 会产生不同的结果?
import itertools
def make_funcs(lst):
for val in lst:
def f():
return sum(1 for i in range(10) if i > val)
f.func_name = ">" + str(val)
yield f
## examples:
for f in make_funcs(range(2)):
print(f.func_name, f())
## prints:
>0 9
>1 8
## works as expected:
for f in make_funcs(range(2)):
for g in make_funcs(range(2)):
print(f.func_name, g.func_name, f() + g())
## prints:
>0 >0 18
>0 >1 17
>1 >0 17
>1 >1 16
另一方面:
## provides results that are counter-intuitive (to me, at least)
for f, g in itertools.product(make_funcs(range(2)), make_funcs(range(2))):
print(f.func_name, g.func_name, f() + g())
## prints:
>0 >0 16
>0 >1 16
>1 >0 16
>1 >1 16
在我看来,它只是抓取/使用/binding 用于计算的每个隐式 for-loop 中的最后一个变量,即使它为函数名称抓取了正确的变量。
关于导致这些结果的范围或函数定义或闭包(或其他),我遗漏了什么?
注意:如果我在这个问题上放置的任何标签无关紧要,请随时删除它们 - 我将它们全部放置是因为我不确定问题是什么。
【问题讨论】:
-
@unutbu 不仅仅是相关的 - 这是同一件事。感谢您的链接,再加上下面的答案之一,这一切都很好!
标签: python function scope closures function-binding