Pop() 在理解列表中使用,不会从初始列表中删除所有项目

Dom*_*que 4 python list

我有一个列表,想通过一些计算创建一个新列表。在做的过程中,我遇到了这样的问题:

为什么 pop() 不立即从列表中删除所有项目?

>>> a= list(range(20))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> [a.pop() for elem in a]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10]
>>> [a.pop() for elem in a]
[9, 8, 7, 6, 5]
>>> [a.pop() for elem in a]
[4, 3, 2]
>>> [a.pop() for elem in a]
[1]
Run Code Online (Sandbox Code Playgroud)

我期望的是

>>> a= list(range(20))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> [a.pop() for elem in a]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

有人能解释这种行为吗?

Rem*_*ich 5

循环 ,for item in a从 0 开始循环索引,直到到达列表末尾。在该循环期间,您通过调用 来减少列表长度pop()。因此,如果列表有 20 个项目,则在循环完 10 个项目后,列表的长度将变为 10,并且循环停止。您只需循环等于列表原始长度一半的次数。

所以第一次,20的一半是10。然后10的一半是5。然后5的一半是3(循环两次后还没有到达终点),那么列表长度是5-3=2和一半即 1。剩下的列表长度为 1, [0]

黄金法则的另一个特殊情况是,在迭代列表时不要改变列表