使用 for 循环在列表中声明多个函数时变量到常量问题
variable to constant problem when declaring multiple functions in a list using for loop
我必须创建一个函数列表,每个函数都非常相似,但常数不同。
例如我想要一个像“乘法”这样的列表
我需要数百个函数,所以我使用了 for,问题是我创建的函数乘以“i”的当前值,而不是乘以“i”在函数已声明
如何获得所需的结果(例如第一个函数列表)?
def main():
#method one (working)
multiplication = []
multiplication.append(lambda z:z*0)
multiplication.append(lambda z:z*1)
multiplication.append(lambda z:z*2)
multiplication.append(lambda z:z*3)
# moltiplication: 2*4
print(multiplication[2](4))
#output: 8
#method two (not working)
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z:z*i)
#supposed to multiply 2*4 but multiply 4*i instead
print(multiplication_2[2](4))
#output: 12
i = 22
print(multiplication_2[2](4))
#output: 88
if (__name__ == '__main__'):
main()
我知道我可以将参数传递给函数,但这只是一个可以引导我解决问题的示例。在实际用例中,需要像这样创建函数
诀窍是确保您在定义 lambda 时计算 i
,而不是在 lambda 主体内部(只有在调用 lambda 时才会计算):
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z, i=i: z * i)
print(multiplication_2[2](4))
#output: 8
i = 22
print(multiplication_2[2](4))
#output: 8
i=i
“技巧”之所以有效,是因为计算了右侧(因此它在循环中获得了 i
的当前值),然后用作i
lambda 中的参数(隐藏任何新值 i
可能在外部范围内)。
如果不那么令人困惑,您可以为参数指定一个与默认参数不同的名称,例如:
multiplication = [(lambda z, j=i: z * j) for i in range(4)]
print([f(4) for f in multiplication]) # [0, 4, 8, 12]
在上面的例子中,j
是 lambda 内部的参数,每个 lambda 都有不同的 j
默认值,相当于 i
在创建 lambda 的时间。
我必须创建一个函数列表,每个函数都非常相似,但常数不同。
例如我想要一个像“乘法”这样的列表
我需要数百个函数,所以我使用了 for,问题是我创建的函数乘以“i”的当前值,而不是乘以“i”在函数已声明
如何获得所需的结果(例如第一个函数列表)?
def main():
#method one (working)
multiplication = []
multiplication.append(lambda z:z*0)
multiplication.append(lambda z:z*1)
multiplication.append(lambda z:z*2)
multiplication.append(lambda z:z*3)
# moltiplication: 2*4
print(multiplication[2](4))
#output: 8
#method two (not working)
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z:z*i)
#supposed to multiply 2*4 but multiply 4*i instead
print(multiplication_2[2](4))
#output: 12
i = 22
print(multiplication_2[2](4))
#output: 88
if (__name__ == '__main__'):
main()
我知道我可以将参数传递给函数,但这只是一个可以引导我解决问题的示例。在实际用例中,需要像这样创建函数
诀窍是确保您在定义 lambda 时计算 i
,而不是在 lambda 主体内部(只有在调用 lambda 时才会计算):
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z, i=i: z * i)
print(multiplication_2[2](4))
#output: 8
i = 22
print(multiplication_2[2](4))
#output: 8
i=i
“技巧”之所以有效,是因为计算了右侧(因此它在循环中获得了 i
的当前值),然后用作i
lambda 中的参数(隐藏任何新值 i
可能在外部范围内)。
如果不那么令人困惑,您可以为参数指定一个与默认参数不同的名称,例如:
multiplication = [(lambda z, j=i: z * j) for i in range(4)]
print([f(4) for f in multiplication]) # [0, 4, 8, 12]
在上面的例子中,j
是 lambda 内部的参数,每个 lambda 都有不同的 j
默认值,相当于 i
在创建 lambda 的时间。