关于python:Python3 – for循环删除列表项

Python3 - for loop remove list item

本问题已经有最佳答案,请猛点这里访问。

我有代码:

1
2
3
4
5
6
7
8
listA = [i for i in range(5)]

for x in listA :
    print(listA)
    print('prepare to remove %s'%x)
    listA.remove(x)
    listA = [i for i in range(x, 10)]
    print(listA)

我想for循环中的x将是:零一二三四

但结果是零二三四

为什么?这太奇怪了…

我只想知道为什么1消失了,为什么不打印0 2 4或01234?只有1

有人能解释吗?


请参阅下面的代码

  • 在第一次迭代中,lst.remove(x)有效地从ID为XXXX的LST,LST现在为[1,2,3,4]
  • 在第二次迭代中,由于0已被删除,因此在尝试获取下一个项时,它将在索引1处获取2
  • 从第二次迭代开始,比如@harlekuin注意,您正在对完全新创建的列表,它不会影响ID为XXXX的原始列表,下面的迭代将在ID为XXXX的LST上继续进行[1,2,3,4],因此它的3后面跟着4

代码

1
2
3
4
5
6
7
8
9
lst = [0, 1, 2, 3, 4] # define raw list to make it clearer
# id(lst) = xxxx

# iterate over lst with id xxxx
for x in lst:
    print('prepare to remove %s'%x)
    lst.remove(x) # 1st loop operate on list with id xxxx, 2nd loop onwards operate on list with id yyyy
    lst = [i for i in range(x, 10)] # lst being assign to another id, lets assume its yyyy now
    # id(lst) = yyyy

问题是在循环条件和内部使用相同的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
# List to loop x over
listB = [i for i in range(5)]
# List to manipulate with remove
listA = [i for i in range(0, 10)]
for x in listB:
    print('loop: %s'%x)
    print('list before removing %s'%x)
    print(listA)
    listA.remove(x)
    print('list after removing %s'%x)
    print(listA)
    # Re-initialize listA
    listA = [i for i in range(x, 10)]

这将产生以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
loop: 0
list before removing 0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list after removing 0
[1, 2, 3, 4, 5, 6, 7, 8, 9]
loop: 1
list before removing 1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list after removing 1
[0, 2, 3, 4, 5, 6, 7, 8, 9]
loop: 2
list before removing 2
[1, 2, 3, 4, 5, 6, 7, 8, 9]
list after removing 2
[1, 3, 4, 5, 6, 7, 8, 9]
loop: 3
list before removing 3
[2, 3, 4, 5, 6, 7, 8, 9]
list after removing 3
[2, 4, 5, 6, 7, 8, 9]
loop: 4
list before removing 4
[3, 4, 5, 6, 7, 8, 9]
list after removing 4
[3, 5, 6, 7, 8, 9]


在第一个循环中,您从listA中删除0,它指的是oryginal [0, 1, 2, 3, 4],您有[1, 2, 3, 4]for使用对同一列表的引用,因此在下一个循环中,它使用[1, 2, 3, 4]并跳过1

但同时,您将新列表分配给变量listA,所以在下一个循环中,您将从新列表中删除1,但for仍然使用对oryginal [1, 2, 3, 4]的引用,并且它不会跳过其他元素。


这是因为您删除了x(一个整数),然后用range(x,10)重新创建列表。第一次执行此操作时,将从原始列表中删除1,但打印前将重新创建列表,因此只有第一个循环将丢失一个数字。换句话说,

1
list.remove(x)

一旦你:

1
list = [i for i in range(x, 10)]