为什么这个python生成器每次都返回相同的值?
我有一个生成列表的生成器:为什么这个python生成器每次都返回相同的值?,python,generator,yield,Python,Generator,Yield,我有一个生成列表的生成器: def gen(): state = [None] for i in range(5): state[0] = i yield state 这里是输出,当我调用它时: >>> list(gen()) [[4], [4], [4], [4], [4]] 为什么所有的元素都是[4]?不应该是[[0]、[1]、[2]、[3]、[4]?您正在重用同一个列表对象。生成器会一次又一次地返回一个对象,并在运行时
def gen():
state = [None]
for i in range(5):
state[0] = i
yield state
这里是输出,当我调用它时:
>>> list(gen())
[[4], [4], [4], [4], [4]]
为什么所有的元素都是
[4]
?不应该是[[0]、[1]、[2]、[3]、[4]
?您正在重用同一个列表对象。生成器会一次又一次地返回一个对象,并在运行时对其进行操作,但对它的任何其他引用都会看到相同的更改:
>>> r = list(gen())
>>> r
[[4], [4], [4], [4], [4]]
>>> r[0] is r[1]
True
>>> r[0][0] = 42
>>> r
[[42], [42], [42], [42], [42]]
生成列表的副本或创建新的新列表对象,而不是操纵列表对象
def gen_copy():
state = [None]
for i in range(5):
state[0] = i
yield state.copy() # <- copy
def gen_new():
for i in range(5):
state = [i] # <- new list object every iteration
yield state
def gen_copy():
状态=[无]
对于范围(5)中的i:
状态[0]=i
屈服状态.copy()#您是屈服的
相同的列表/对象
,因此您总是可以看到添加到列表中的最后一个值。您应提交一份副本:
yield state.copy()
或在第一个循环内创建列表:
for i in range(5):
state = [i]
每次创建一个新列表/对象都很容易:
def gen():
for i in range(5):
state = [None]
state[0] = i
yield state