问题描述:
ss = [2, 3, 6, 9, 7, 1]
for i in ss:
ss.remove(min(ss))
print(min(ss), end=",")
输出结果是多少?为什么只循环了三次呢?
问题解答:循环次数是根据当前,即变换后的列表的长度决定的,而之前的循环次数是一直累计在内的。
代码分析
-
初始状态:
ss = [2, 3, 6, 9, 7, 1]
-
循环过程:
- 第一次循环:
i = 2
(因为for i in ss
是按顺序遍历ss
的元素)min(ss) = 1
ss.remove(1)
,删除1
后ss
变为[2, 3, 6, 9, 7]
- 打印
min(ss)
,即2
- 当前输出:
2,
- 第二次循环:
i = 3
min(ss) = 2
ss.remove(2)
,删除2
后ss
变为[3, 6, 9, 7]
- 打印
min(ss)
,即3
- 当前输出:
2,3,
- 第三次循环:
i = 6
min(ss) = 3
ss.remove(3)
,删除3
后ss
变为[6, 9, 7]
- 打印
min(ss)
,即6
- 当前输出:
2,3,6,
- 第一次循环:
-
循环终止:
for i in ss
在每次迭代开始时,会检查ss
列表的长度。但是,由于我们在循环中修改了ss
的长度,导致循环次数减少。原本ss
有 6 个元素,但是我们每次都删除一个元素,使得列表变短。实际上,迭代器在开始遍历时就已经确定了需要遍历的元素数量(原本的ss
中的 6 个元素),但由于在循环过程中修改了ss
,实际遍历次数减少了。
具体来说,每次删除一个元素后,ss
的长度变为原来的长度减去 1。最开始列表的长度是 6,随着每次删除一个元素,列表的长度变成 5,再变成 4。当遍历到第三个元素时,列表的长度变成了 3,而此时迭代器已经走完了原本应该遍历的 6 个元素中的前 3 个,因此循环终止。
最终输出
最终输出结果是:
2,3,6,