【发布时间】:2018-10-12 03:34:20
【问题描述】:
编辑:当我想修改原始列表时,我知道要遍历列表的副本。但是,我收到的关于在迭代列表时修改列表有什么问题的唯一解释是“它可能导致意外结果”。
考虑以下几点:
lst = ['a', 'b', 'c', 'd', 'e']
for x in lst:
lst.remove(x)
print(lst)
这是我试图解释在迭代列表时修改列表时实际发生的情况。请注意,line2 等价于for i in range(len(lst)):,并且len(lst) 每次迭代都会减 1。
len(lst) 以 5 开头。
当i = 0 时,我们删除了lst[i] = 'a',所以lst = ['b', 'c', 'd', 'e']。 len(lst) 减少到 4。
当i = 1,我们有lst[i] = 'c'被删除,所以lst = ['b', 'd', 'e']
len(lst) 减少到 3。
当i = 2 时,我们删除了lst[i] = 'e',所以lst = ['b', 'd']。 len(lst) 减少到 2。
这是我认为会引发 IndexError 的地方,因为 i = 2 不在 range(2) 中。但是,程序只是输出['b', 'd']。是因为i“赶上了”len(lst)吗?另外,到目前为止我的推理是否合理?
【问题讨论】:
-
复制您的列表,并在该副本上使用您的索引。
-
@jozzas 她在问迭代是如何工作的。我没有看到它回答了您提到的问题。
-
@BcK 我的目的不是清除列表;我只是想了解在后台发生了什么。
-
Removing from a list while iterating over it 的可能副本此副本的最佳答案讨论(具有良好的可视化)这里发生的事情。它略有不同,因为并非所有元素都被删除,但我认为足够接近以成为骗子。
标签: python python-3.x iteration