Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个python生成器每次都返回相同的值?_Python_Generator_Yield - Fatal编程技术网

为什么这个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