我试图创建一系列函数,通过“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
值
在第二个for
循环中,第一个for
循环末尾的idx
值为4,这导致第二个for循环输出相同的结果。在第三个for循环中,idx
变量再次在每次迭代时更改值
这将导致函数在第三个for循环中按预期运行
这是正确的解释吗
但这显然是定义单参数函数族的错误方法。那么,Python式的方法是什么呢
注意:有些人可能建议将第一个循环中的f
定义为接受两个参数:实际参数和移位参数。在我的代码中,由于某些技术原因,我无法在正在使用的代码库中执行此操作。也许咖喱是一种选择?如果有一个更简单的Python解决方案来创建一个(两个,三个…)参数的函数族,我不想去那里
由于
idx
的值不同,中两个循环的输出不同在第一个
for
循环中,将函数f()
的引用存储在fns
列表中。这里,idx
的值不是作为函数f()
的一部分存储在fnx
中执行此循环后,
idx
将值保存为4
(来自for
循环的N-1)因此,第二个循环使用
idx
作为4
打印值。i、 e.f()
打印值4+1
但是,在第三个循环中,您正在初始化
idx
的值,作为for
循环的一部分,并且您的fns
在每次迭代中都会获得范围为0到4的值这就是为什么在这里可以看到从1到N的值(因为
idx
从0到N-1)相关问题 更多 >
编程相关推荐