python-3.x - .remove 方法在 python 中有何不同?
问题描述
a = [(1, 1), (35, 1), (1, 35), (35,35)]
for i in a:
print(i)
然后它打印
(1, 1)
(35, 1)
(1, 35)
(35, 35)
然而这段代码,虽然我期待同样的结果
a = [(1, 1), (35, 1), (1, 35), (35,35)]
for i in a:
a.remove(i)
print(i)
那么结果是
(1, 1)
(1, 35)
该方法如何.remove
产生这种差异?我不知道它是如何工作的。请帮我!
解决方案
.remove
有所不同,因为您在迭代时更新迭代器。
想象 i
成一个指针,它指向0
th 的索引a
并一直到 . 的末尾length(a)
。(这里,length(a)
它本身正在改变)。
所以你的代码是这样的:
a = [1, 2, 3, 4]
for i in a:
a.remove(i)
print(i)
所以在内部,i
被初始化为指向第一次迭代中的0
第 th 索引。a
在下一次迭代中,i
自动初始化为指向 (如果存在)的1
st 索引a
在下一次迭代中,i
is 自动初始化为指向(如果存在)的第2
nd 索引,依此类推......a
所以这是循环中发生的事情:
迭代 1
a = [1, 2, 3, 4]
i -> 0th index of a = 1
a.remove(i)
a -> [2, 3, 4]
print(i) -> prints 1
迭代 2
a = [2, 3, 4]
i -> 1st index of a = 3
a.remove(i)
a -> [2, 4]
print(i) -> prints 3
迭代 3
a = [2, 4]
i -> 2nd index of a = Does not exist -> Quit iteration
正因为如此,如果你运行上面的程序,只有1
和3
才会被打印出来。
推荐阅读
- gradle - 如何从 Kotlin DSL gradle 脚本中的插件访问属性?
- c# - 从网络服务器向网站添加图像
- powershell - 将脚本输出到新的未保存文本文件
- python-3.x - lightgbm 手动评分功能:F1_SCORE
- matlab - 逆高斯分布的最大似然估计
- android - 从 Google Play 中删除过时的测试版
- python - 接受逗号分隔的数字以及在python中拆分空格
- android - 下载时如何在android应用中的视频上使用ffmpeg覆盖标志?
- json - Jira Build Status Gadget 给出 JSON 解析错误
- php - 使用ajax和php将数据插入postgresql数据库