【问题标题】:lambda function behaves differently when being populated using a for looplambda 函数在使用 for 循环填充时表现不同
【发布时间】:2021-05-31 12:15:03
【问题描述】:

我正在尝试执行一个相当简单的 lambda 函数来打印乘法表。

由于某些奇怪的原因,当我手动填充字典时,它可以工作。

lamdic = {
    'x0': lambda num: num * 1,
    'x1': lambda num: num * 2,
    'x2': lambda num: num * 3,
    'x3': lambda num: num * 4,
    'x4': lambda num: num * 5,
    'x5': lambda num: num * 6,
    'x6': lambda num: num * 7,
    'x7': lambda num: num * 8,
    'x8': lambda num: num * 9,
    'x9': lambda num: num * 10
}

但是,如果我尝试使用 for 循环来执行相同的操作 - 它不会。

for i, l in enumerate(vlst):
    lamdic.update({l: lambda num: num * (i + 1)})

我已打印出字典项,它们似乎以相同的结构填充,但 for 循环无法正确打印。

完整代码:

vlst = ['x' + str(num) for num in range(10)]
lamdic = {}

for i, l in enumerate(vlst):
    lamdic.update({l: lambda num: num * (i + 1)})

for v in vlst:
    for i in range(1, len(vlst) + 1):
        print(lamdic[v](i), end=' ')
    print()

手动分配结果(预期):

1 2 3 4 5 6 7 8 9 10 
2 4 6 8 10 12 14 16 18 20 
3 6 9 12 15 18 21 24 27 30 
4 8 12 16 20 24 28 32 36 40 
5 10 15 20 25 30 35 40 45 50 
6 12 18 24 30 36 42 48 54 60 
7 14 21 28 35 42 49 56 63 70 
8 16 24 32 40 48 56 64 72 80 
9 18 27 36 45 54 63 72 81 90 
10 20 30 40 50 60 70 80 90 100

for循环赋值(意外):

2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110 
2 6 12 20 30 42 56 72 90 110

为什么会有差异?为什么(基本上)做同样的事情会返回不同的结果?

【问题讨论】:

  • 这能回答你的问题吗? Lambda in a loop
  • @mcsoini - 是的,确实如此!非常感谢!您发布的问题将我引向 Python 编程常见问题解答,它很好地解释了它。 docs.python.org/3/faq/…

标签: python python-3.x dictionary lambda


【解决方案1】:

感谢@mcsoini 向我推荐答案。

问题是值没有被绑定,因此在迭代过程中没有改变。

固定代码如下:

vlst = ['x' + str(num) for num in range(10)]
lamdic = {}

for i, l in enumerate(vlst):
    lamdic.update({l: lambda num, saved_i=i: num * (saved_i + 1)})

for v in vlst:
    for i in range(1, len(vlst) + 1):
        print(lamdic[v](i), end=' ')
    print()

输出(如预期):

1 2 3 4 5 6 7 8 9 10 
2 4 6 8 10 12 14 16 18 20 
3 6 9 12 15 18 21 24 27 30 
4 8 12 16 20 24 28 32 36 40 
5 10 15 20 25 30 35 40 45 50 
6 12 18 24 30 36 42 48 54 60 
7 14 21 28 35 42 49 56 63 70 
8 16 24 32 40 48 56 64 72 80 
9 18 27 36 45 54 63 72 81 90 
10 20 30 40 50 60 70 80 90 100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2016-02-23
    • 2017-10-30
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多