gpt4 book ai didi

python - 为什么在使用 yield 时我不能更改正在迭代的列表

转载 作者:太空狗 更新时间:2023-10-29 22:24:45 27 4
gpt4 key购买 nike

我这里有一些可重现的代码:

def test():
a = [0, 1, 2, 3]
for _ in range(len(a)):
a.append(a.pop(0))
for i in range(2,4):
print(a)
yield(i, a)

打印出来:

[1, 2, 3, 0]
[1, 2, 3, 0]
[2, 3, 0, 1]
[2, 3, 0, 1]
[3, 0, 1, 2]
[3, 0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3]

这是我所期望的,但是当我执行 list(test()) 时,我得到:

[(2, [0, 1, 2, 3]),
(3, [0, 1, 2, 3]),
(2, [0, 1, 2, 3]),
(3, [0, 1, 2, 3]),
(2, [0, 1, 2, 3]),
(3, [0, 1, 2, 3]),
(2, [0, 1, 2, 3]),
(3, [0, 1, 2, 3])]

为什么会这样,我该怎么做才能解决这个问题?

最佳答案

因为您总是返回 (i,a) 现在 a 是对列表的引用。因此,您不断地返回一个 referencesame 列表。这对 print 语句来说没有问题,因为它会立即打印 a 在那一刻的状态。

您可以返回列表的副本,例如:

def test():
a = [0, 1, 2, 3]
for _ in range(len(a)):
a.append(a.pop(0))
for i in range(2,4):
print(a)
yield(i, <b>list(</b>a<b>)</b>)

关于python - 为什么在使用 yield 时我不能更改正在迭代的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com