关于“发电机对象”的说明

时间:2014-03-18 15:33:23

标签: python for-loop

有人可以解释为什么这段代码:

A = [1,2,3,4]
B = ((element) for element in A)
print(B)

生成:<generator object <genexpr> at 0x0319B490>

这段代码:

A = [1,2,3,4]
for element in A:
    print(A)

产生

1
2
3
4 

他们似乎和我一样,但他们显然是不同的。我无法弄清楚它们之间的区别。

感谢。

3 个答案:

答案 0 :(得分:4)

第一个代码是generator expression,因此它将在某个内存地址创建一个生成器对象。如果您想使用list comprehension,请按照{/ 1>}使用[]

A = [1,2,3,4]
B = [element for element in A]
print(B)
# [1, 2, 3, 4]

此列表理解等同于:

A = [1,2,3,4]
B = []
for element in A:
    B.append(element)

答案 1 :(得分:1)

第一个不是循环而是生成器表达式因此将打印B它向我们显示对象ref。 第二个是循环,它遍历元素并打印出来。

尝试这样做,你可以迭代生成器:

A = [1,2,3,4]
B = ((element) for element in A)
for e in B:
    print(e)

这将导致与第二次表达相同:

for e in A:
    print(e)

请注意,您只能迭代一次,直到生成器耗尽为止。

答案 2 :(得分:1)

两者之间的根本区别在于,生成器表达式定义了一个在循环时生成值的对象。换句话说,将在每次迭代时生成值并按需消耗。使用列表推导,这些值是预先创建的,并且将消耗尽可能多的内存,以便一次性保存内存中的所有值。

很容易将这两个结构视为完全相同的东西,但在生成器的情况下,您以懒惰的方式按需消耗值。这非常有用,因为您无需支付内存费用来预先保存所有数据。