【问题标题】:Remove elements from python list从 python 列表中删除元素
【发布时间】:2021-05-23 22:09:56
【问题描述】:

我试图理解这里的逻辑,为什么这段代码没有删除列表中的所有元素?

int_lst = [1, 2, 3, 4, 5, 6]

for i in int_lst:
    int_lst.remove(i)
    print(int_lst)

print(int_lst)  #Output: [2, 4, 6]

【问题讨论】:

  • 您在循环遍历列表时正在修改列表。因此,它可能会跳过一些元素 (2, 4, 6)

标签: python list element


【解决方案1】:

当您删除一个元素时,该元素之后的所有内容都会有效地移回一个位置。但是迭代器不知道:它只是将指针前进到下一个元素,跳过应该是绑定到i 的下一个值。

详细地说,i 从 1 开始。你删除它,现在 2 在迭代器的当前位置。迭代器前进,现在 3 在当前位置并绑定到i

换句话说,每次删除一个元素时,都会有效地推进迭代器,除了迭代器将执行的显式推进。

【讨论】:

  • 您能否在不删除当前迭代的情况下进一步阐明为什么“迭代器前进”!第一次迭代: 1 被删除,现在 int_lst=[2,3,4,5,6] 第二次迭代为什么不 2 没有被删除,将是 int_lst=[3,4,5,6]
  • 也许 Python 保存了下一个元素的索引,当前一个元素被删除时,下一个元素取他的元素?
  • 因为迭代器指针与列表分开存在。删除 1 后,指针保持不变,但现在之前被 1 占用的插槽现在被 2 占用,被 2 占用的插槽现在被 3 占用,等等。一旦循环体完成,现在迭代器前进指针,这意味着它从第一个插槽移动到第二个插槽(现在被 3 占用,而不是 2)。
【解决方案2】:

发生这种情况是因为您要删除正在迭代的同一列表中的元素。您可以通过避免这种情况轻松修复它:

for i in list(int_lst):
    int_lst.remove(i)

【讨论】:

  • 我认为这是一个浅拷贝
  • 这种情况下没有问题
猜你喜欢
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多