python - 为什么这个 python 生成器每次都返回相同的值?

标签 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]]吗?

最佳答案

您正在重复使用同一个列表对象。您的生成器一遍又一遍地返回一个对象,在它运行时对其进行操作,但对它的任何其他引用都会看到相同的更改:

>>> 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

关于python - 为什么这个 python 生成器每次都返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31687185/

相关文章:

python - 将逻辑回归和连续回归与 scikit-learn 相结合

javascript - 基于生成器的Javascript协程库,支持Chrome浏览器

带有 numpy 数组的 Python 生成器

python - lambda 中生成器的行为对 future 的变化安全吗?

c# - 我不明白来自 MSDN 的这段代码

python - salt 执行模块中的产量以在执行期间返回状态

python - 如何自定义pynotify?

python - 如何以跨 Linux、Windows 和 MacOS 可移植的方式收集 Python 3 中的当前架构?

python - 如何在Python中通过名称更改变量?

python - Unix 管道上的惰性 python