作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在迭代一个列表,如下所示:
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/
我是一名优秀的程序员,十分优秀!