List Comprehension输出与嵌套for循环不同?

时间:2017-11-06 11:37:24

标签: python

我真的很遗憾为什么这个列表理解会产生不同的输出到我认为与嵌套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)]

为什么两者之间的输出存在差异?

1 个答案:

答案 0 :(得分: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))