pra*_*ksh 8 python yield generator
这是我的发电机:
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]]调用),但所有的相同的值[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
您是yielding一样的list/object,因此您始终会看到添加到列表中的最后一个值。您应该提供一份副本:
yield state.copy()
或者在第一个循环内创建列表:
for i in range(5):
    state = [i]
每次创建一个新的列表/对象都很容易:
def gen():
    for i in range(5):
        state = [None]
        state[0] = i
        yield state
| 归档时间: | 
 | 
| 查看次数: | 1718 次 | 
| 最近记录: |