2

我对 Python 比较陌生,我一生都无法弄清楚这里发生了什么。Python 在使用循环列表时会跳过所有其他数字for,但仅在输入一定数量的元素之后。这是我正在处理的一个更大项目的一部分,但这段代码说明了它。

代码正常工作到 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)

输出:

[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]
4

3 回答 3

6

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

于 2013-09-05T00:05:58.073 回答
6
l3 = l1

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

例如,假设我们正在遍历以下列表并删除b

-----------------
| 一个 | 乙 | c | d |
-----------------
      ^(我们在 b 上)

-----------------
| 一个 | | c | d |
-----------------
      ^(删除 b)

-------------
| 一个 | c | d |
-------------
      ^(向下移动元素)

-------------
| 一个 | c | d |
-------------
          ^(步骤)

请注意,我们跳过了c.

也许你的意思是

l3 = list(l1)  # create a new, independent list
于 2013-09-05T00:06:12.903 回答
1

在迭代集合时,您不会从集合中删除元素。 l1l3引用相同的列表。也许您的意图是:

    l3= list(l1)

这将需要一个副本。

于 2013-09-05T00:06:47.390 回答