为什么在具有不同值的循环中定义的lambdas都返回相同的结果?

原始代码:


squares = []
for x in range(5):
    squares.append(lambda: x ** 2)

for i in range(5):
    print(squares[i](), end=' ')  # 16 16 16 16 16

# 期望,当它们被调用时,它们将分别返回 0 、 1 、 4 、 9 和 16 

# 发生这种情况是因为 x 不是lambdas的内部变量,而是在外部作用域中定义,并且在调用lambda时访问它 - 而不是在定义它时。
# 在循环结束时, x 的值是 4 ,所以所有的函数现在返回 4**2 ,即 16


# 为了避免这种情况,你需要将值保存在lambdas的局部变量"n"中,这样它们就不依赖于全局``x`` 的值

squares = []
for x in range(5):
    squares.append(lambda n=x: n ** 2)

for i in range(5):
    print(squares[i](), end=' ')  # 0 1 4 9 16



其他类似的示例代码:


def multipliers_1():
    return [lambda x: i * x for i in range(4)]

print([m(2) for m in multipliers_1()])  
# 输出 [6, 6, 6, 6]



def multipliers_2():
    return [lambda x, y=i: x * y for i in range(4)]
    
print([m(2) for m in multipliers_2()])  
# 输出 [0, 2, 4, 6]
展开阅读全文

页面更新:2024-04-23

标签:定义   示例   全局   变量   局部   函数   原始   类似   作用   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top