改变我正在迭代的列表时出现意外行为

vai*_*dil 2 python list python-3.x

我对Python比较陌生,我不能为我的生活弄清楚这里发生了什么.当for用于遍历列表时,Python正在跳过所有其他数字,但仅在一定数量的元素之后.这是我正在处理的更大项目的一部分,但是这段代码说明了它.

代码正常工作到7,此时它开始跳过其他所有数字.我知道不要编辑我正在迭代过程中的列表,所以我要避免这样做,但是for甚至没有调用它们中的一些.我需要做些什么来让它循环遍历每个数字而不是其他所有数字?它为什么这样做?

码:

import math

i1 = 60
l1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59]
l3 = l1

print(l1)
for a in l1:
    print(a)
    if a > math.floor(math.sqrt(i1)):
        print("REMOVED: " + str(a))
        l3.remove(a)

print(l3)
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49, 53, 59]
2
3
5
7
11
REMOVED: 11
17
REMOVED: 17
23
REMOVED: 23
31
REMOVED: 31
41
REMOVED: 41
47
REMOVED: 47
53
REMOVED: 53
[2, 3, 5, 7, 13, 19, 29, 37, 43, 49, 59]
Run Code Online (Sandbox Code Playgroud)

Cam*_*arr 6

l3并且l1指向同一个列表,如果您希望它们是唯一的,请使用l3 = l1[:]


ars*_*jii 6

l3 = l1
Run Code Online (Sandbox Code Playgroud)

现在,l3l1同一列表.召唤remove()一个也会影响另一个.因此,当您l3.remove(a)在迭代时调用时l1,l1(!)中的项被删除,所有后续元素都向下移动,循环迭代到下一个元素,因此跳过一个项.

例如,假设我们循环遍历以下列表并删除b:

-----------------
| a | b | c | d |
-----------------
      ^ (we're on b)

-----------------
| a |   | c | d |
-----------------
      ^ (remove b)

-------------
| a | c | d |
-------------
      ^ (shift elements down)

-------------
| a | c | d |
-------------
          ^ (step)

请注意,我们跳过了c.

也许你的意思

l3 = list(l1)  # create a new, independent list
Run Code Online (Sandbox Code Playgroud)