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循环中的
但结果是零二三四
为什么?这太奇怪了…
我只想知道为什么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] |
在第一个循环中,您从
但同时,您将新列表分配给变量
这是因为您删除了x(一个整数),然后用range(x,10)重新创建列表。第一次执行此操作时,将从原始列表中删除1,但打印前将重新创建列表,因此只有第一个循环将丢失一个数字。换句话说,
1 | list.remove(x) |
一旦你:
1 | list = [i for i in range(x, 10)] |
号