为什么g.append(l.pop())返回l的后半部分而l只有前半部分

2 投票
1 回答
510 浏览
提问于 2025-05-10 15:36

在我写一个程序的时候,发现了代码里一个奇怪的行为。以下是我看到的情况。

>>> l = [1,2,3,4,5,6,7,8]
>>> g = []
>>> for i in l:
...     g.append(l.pop())
... 
>>> l
[1, 2, 3, 4]
>>> g
[8, 7, 6, 5]
>>> 

这个列表 g 本来应该包含列表 l 的所有元素!可是为什么它只考虑了一半的列表呢?

特别说明: 我并不是在尝试复制一个列表或反转一个列表。这是我在做其他事情时发现的一个问题。

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

11

通常情况下,你不应该这样做!
在循环中改变你正在遍历的对象是不好的做法!

解释:
如你所见,l.pop() 总是取出 l 中的最后一个项目。
g.append() 则是把取出的项目添加到 g 的末尾。
经过四次循环后,l 就没有任何项目了。

第一次运行:

i =  v
l = [1,2,3,4,5,6,7]
g = [8]

第二次运行:

i =    v
l = [1,2,3,4,5,6]
g = [8,7]

第三次运行:

i =      v
l = [1,2,3,4,5]
g = [8,7,6]

第四次运行:

i =        v
l = [1,2,3,4]
g = [8,7,6,5]

现在我们已经到达 l 的末尾,所以停止循环。

撰写回答