为什么修改迭代序列是不安全的?

l--*_*''' 18 python

修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表).如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本.切片表示法使这特别方便:

   >>> for x in a[:]: # make a slice copy of the entire list
   ...    if len(x) > 6: a.insert(0, x)
   ... 
   >>> a
   ['defenestrate', 'cat', 'window', 'defenestrate']
Run Code Online (Sandbox Code Playgroud)

为什么这样做不安全for x in a

小智 16

没有太过技术性:

如果您在Python中迭代一个可变序列并且在迭代过程中更改了序列,那么将会发生什么事情并不总是很清楚.如果在迭代过程中在序列中插入一个元素,那么现在可以合理地将其视为序列中的"下一个"元素?如果删除下一个对象怎么办?

因此,在更改它时迭代可变序列会导致未指定的行为.任何事情都可能发生,具体取决于列表的实现方式.:-)


Ned*_*der 13

这是许多语言中的常见问题.如果您有一个线性数据结构,并且您正在迭代它,那么必须跟踪您在结构中的位置.它可能是当前索引或指针,但它是某种指向"当前位置"的指针.

如果在迭代发生时修改列表,则该游标可能不正确.

一个常见的问题是你删除光标下的项目,一切都向下滑动一个,循环的下一次迭代增加光标,你无意中跳过了一个项目.

一些数据结构实现提供了在迭代时删除项目的能力,但大多数情况下没有.

  • 这就是要点:迭代器不会收到有关修改的通知,因此它会错过或跳过项目。 (2认同)