Python 关于“的解释”;“生成器对象”;

Python 关于“的解释”;“生成器对象”;,python,for-loop,Python,For Loop,有人能解释一下为什么这个代码: A = [1,2,3,4] B = ((element) for element in A) print(B) A = [1,2,3,4] for element in A: print(A) 产生: 而此代码: A = [1,2,3,4] B = ((element) for element in A) print(B) A = [1,2,3,4] for element in A: print(A) 产生: 1 2 3 4 他们在我

有人能解释一下为什么这个代码:

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

而此代码:

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

1
2
3
4 
他们在我看来似乎是一样的,但他们显然是不同的。我想不出他们之间的区别

谢谢。

第一个代码是,因此它将在某个内存地址创建生成器对象。如果要使用,请按照以下说明使用
[]

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)

第一个不是一个循环,而是一个生成器表达式,因此打印B时会显示对象引用。 第二个是循环,它迭代元素并打印所有元素

尝试执行此操作,可以在生成器上迭代:

A = [1,2,3,4]
B = ((element) for element in A)
for e in B:
    print(e)
这将导致与第二次表达式相同的结果:

for e in A:
    print(e)

请注意,在对生成器进行检查之前,只能迭代一次。

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

很容易将这两个构造视为完全相同的东西,但在生成器的情况下,您是在以一种惰性的方式按需使用值。这是非常有用的,因为您不必支付内存成本来提前保存所有数据