使用 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 的时间。