我在理解以下代码段的结果时遇到了一些麻烦,我认为这是因为我对函数绑定感到困惑。为什么以下片段会产生不同的结果?
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
进行计算,即使它为函数名称抓取了正确的变量。
关于导致这些结果的范围或函数定义或闭包(或其他),我缺少什么?
注意:如果我在这个问题上放置的任何标签是无关紧要的,请随时删除它们 - 我将它们全部放置是因为我不确定问题是什么。