首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用for循环在列表中声明多个函数时,变量变为常量问题

在使用for循环在列表中声明多个函数时,变量变为常量问题
EN

Stack Overflow用户
提问于 2022-02-01 19:38:28
回答 1查看 32关注 0票数 1

我必须创建一个函数列表,每个函数都非常相似,但是有一个不同的常量。

例如,我想要一个类似“乘法”的列表。

我需要数百个函数,所以我使用了一个for,问题是我创建的函数乘以当前的"i“值,而不是被声明函数时的"i”值。

如何获得所需的结果(例如,函数的第一列表)?

代码语言:javascript
复制
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()

我知道我可以把一个参数传递给函数,但这只是一个例子,可以引导我解决我的问题。在实际用例中,需要像这样创建函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 19:41:31

诀窍是确保在定义lambda时计算i,而不是在lambda的主体内(只有在lambda被调用时才会对其进行评估):

代码语言:javascript
复制
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的当前值),然后被用作lambda中i参数的默认参数值(跟踪i在外部作用域中可能具有的任何新值)。

如果参数不那么混乱,您可以为参数指定一个与默认参数不同的名称,例如:

代码语言:javascript
复制
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都有一个不同的默认值,相当于在创建lambda时i拥有的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70946541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档