gpt4 book ai didi

python - 当您尝试在遍历列表元素时删除它会发生什么

转载 作者:太空狗 更新时间:2023-10-30 02:01:49 25 4
gpt4 key购买 nike

我正在迭代一个列表,如下所示:

some_list = [1, 2, 3, 4]
another_list = [1, 2, 3, 4]

for idx, item in enumerate(some_list):
del some_list[idx]

for item in another_list:
another_list.remove(item)

当我打印出列表的内容时

>>> some_list
[2, 4]
>>> another_list
[2, 4]

我知道 Python 不支持在迭代 list 时修改它,正确的方法是迭代列表的副本。但我想知道幕后到底发生了什么,即为什么上面代码片段的输出是 [2, 4]

最佳答案

您可以使用自制的迭代器来显示(在本例中为 print)迭代器的状态:

class CustomIterator(object):
def __init__(self, seq):
self.seq = seq
self.idx = 0

def __iter__(self):
return self

def __next__(self):
print('give next element:', self.idx)
for idx, item in enumerate(self.seq):
if idx == self.idx:
print(idx, '--->', item)
else:
print(idx, ' ', item)
try:
nxtitem = self.seq[self.idx]
except IndexError:
raise StopIteration
self.idx += 1
return nxtitem

next = __next__ # py2 compat

然后在您要检查的列表周围使用它:

some_list = [1, 2, 3, 4]

for idx, item in enumerate(CustomIterator(some_list)):
del some_list[idx]

这应该说明在这种情况下会发生什么:

give next element: 0
0 ---> 1
1 2
2 3
3 4
give next element: 1
0 2
1 ---> 3
2 4
give next element: 2
0 2
1 4

虽然它只适用于序列。映射或集合更复杂。

关于python - 当您尝试在遍历列表元素时删除它会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45946228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com