修改循环中迭代的序列是不安全的(这只能发生在可变序列类型中,例如列表).如果您需要修改正在迭代的列表(例如,复制所选项目),则必须迭代副本.切片表示法使这特别方便:
Run Code Online (Sandbox Code Playgroud)>>> 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']
为什么这样做不安全for x in a?
小智 16
没有太过技术性:
如果您在Python中迭代一个可变序列并且在迭代过程中更改了序列,那么将会发生什么事情并不总是很清楚.如果在迭代过程中在序列中插入一个元素,那么现在可以合理地将其视为序列中的"下一个"元素?如果删除下一个对象怎么办?
因此,在更改它时迭代可变序列会导致未指定的行为.任何事情都可能发生,具体取决于列表的实现方式.:-)
Ned*_*der 13
这是许多语言中的常见问题.如果您有一个线性数据结构,并且您正在迭代它,那么必须跟踪您在结构中的位置.它可能是当前索引或指针,但它是某种指向"当前位置"的指针.
如果在迭代发生时修改列表,则该游标可能不正确.
一个常见的问题是你删除光标下的项目,一切都向下滑动一个,循环的下一次迭代增加光标,你无意中跳过了一个项目.
一些数据结构实现提供了在迭代时删除项目的能力,但大多数情况下没有.
| 归档时间: |
|
| 查看次数: |
3006 次 |
| 最近记录: |