我正在尝试创建一系列函数,并通过“shift”参数进行参数化。考虑下面的代码。
我希望 for 循环创建一组函数,每个函数都会改变
不同数量的争论。
# Python 3 code.
N = 5
fns = []
for idx in range(N):
def f(x): # shift input by idx
return x+idx
fns.append(f)
print("---------------------------")
for i in range(N):
print(fns[i](1))
print("---------------------------")
for idx in range(N):
print(fns[idx](1))
运行代码后,我得到一些奇怪的东西:
---------------------------
5
5
5
5
5
---------------------------
1
2
3
4
5
为什么两个 for 循环的输出不同,尽管它们在概念上做的是相同的事情?
可能的原因?:在第二次循环中,我恢复了名称idx
这是第一个中使用的for
循环创建函数列表。
所以这里可能存在一些“绑定”魔法,即所有函数基本上都使用idx
在其调用期间的紧邻范围内。
在第2次for
循环的值idx
在第一个的末尾for
循环为 4,这导致第二个 for 循环输出相同的结果。在第三个 for 循环中,idx
变量在每次迭代时再次改变值
这会导致函数按照第三个 for 循环的预期运行。
这是正确的解释吗?
但这显然是一种定义单参数函数族的有缺陷的方法。那么 Pythonic 的做法是什么呢?
注意:有些人可能建议定义f
在第一个循环中接受两个参数:实际参数和移位参数。在我的代码中,由于某些技术原因,我无法在我正在使用的代码库中执行此操作。也许柯里化是一种选择?我不想去那里,如果有一个更简单的Python解决方案来创建一个(二,三...)参数函数族