我对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)
输出:
[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]
答案 0 :(得分:6)
l3
和l1
指向同一个列表,如果您希望它们是唯一的,请使用l3 = l1[:]
答案 1 :(得分:6)
l3 = l1
现在,l3
和l1
引用了相同的列表。在一个上调用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
答案 2 :(得分:1)
迭代时,您不会从集合中删除元素。 l1
和l3
引用相同的列表。也许你的意图是:
l3= list(l1)
这将需要一份副本。