为什么这个 python 生成器每次都返回相同的值?
Why is this python generator returning the same value everytime?
我有这个生成列表的生成器:
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]]
吗?
您正在重复使用同一个列表对象。您的生成器 returns 一遍又一遍地操作一个对象,但对它的任何其他引用都会看到相同的更改:
>>> 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
您 yielding
与 list/object
相同,因此您始终会看到添加到列表中的最后一个值。您应该生成一份副本:
yield state.copy()
或者在第一个循环中创建列表:
for i in range(5):
state = [i]
每次创建一个新的 list/object 会很容易:
def gen():
for i in range(5):
state = [None]
state[0] = i
yield state
我有这个生成列表的生成器:
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]]
吗?
您正在重复使用同一个列表对象。您的生成器 returns 一遍又一遍地操作一个对象,但对它的任何其他引用都会看到相同的更改:
>>> 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
您 yielding
与 list/object
相同,因此您始终会看到添加到列表中的最后一个值。您应该生成一份副本:
yield state.copy()
或者在第一个循环中创建列表:
for i in range(5):
state = [i]
每次创建一个新的 list/object 会很容易:
def gen():
for i in range(5):
state = [None]
state[0] = i
yield state