【问题标题】:List Comprehension output different than nested for loops?列表理解输出不同于嵌套的for循环?
【发布时间】:2017-11-06 11:37:24
【问题描述】:

我真的不知道为什么这个列表理解生成的输出与我认为的嵌套 for 循环的等效输出不同。任何人都可以提供任何见解吗?

列表理解:

[(n ** 5, m ** 3) for n in range(3) for m in range(5) if m % 2 == 0]

结果如下:

[(0, 0), (0, 8), (0, 64), (1, 0), (1, 8), (1, 64), (32, 0), (32, 8), (32, 64)]

但是,我认为是等效的嵌套 For 循环:

L = []
for n in range(3):
    for m in range(5):
        if m % 2 == 0:
            n = n**5
            m = m**3
            vals = (n,m)
            L.append(vals)
L

结果如下:

[(0, 0),
 (0, 8),
 (0, 64),
 (1, 0),
 (1, 8),
 (1, 64),
 (32, 0),
 (33554432, 8),
 (42535295865117307932921825928971026432, 64)]

为什么两者的输出会有差异?

【问题讨论】:

    标签: python


    【解决方案1】:

    您的嵌套循环不等同于列表推导,因为您在内部循环中更改了n

    n = n**5
    

    对于01 以外的任何值,这会以指数方式增加n。因此,对于外循环的最后一次迭代,设置了 n = 2,但随后将 2 ** 5 = 32 分配给 n,然后分配 32 ** 5 = 33554432

    使用不同的名称:

    L = []
    for n in range(3):
        for m in range(5):
            if m % 2 == 0:
                n_power_5 = n**5
                m_power_3 = m**3
                vals = (n_power_5, m_power_3)
                L.append(vals)
    

    或者根本不使用中间变量:

    for n in range(3):
        for m in range(5):
            if m % 2 == 0:
                L.append((n**5, m**3))
    

    【讨论】:

    • 谢谢马丁。我能问你等效的嵌套 for 循环应该是什么吗?这将有助于我的理解。
    • @jsynnott 不要做那些单独的作业,只做vals = (n**5, m**3)
    • @jsynnott:使用不同的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2011-04-07
    • 1970-01-01
    • 2021-02-13
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多