求教一个让人疑惑的 Python 循环问题

2019-11-02 11:14:14 +08:00
 alphabeta

如下代码,先给一个集合赋值:

sets = set(range(1,11))

然后遍历集合并打印其值,其中会从集合中减去一个小集合,得到差集:

for i in sets: print(i) sets = sets - {2,3,4,5,6}

按我的理解,循环从 1 开始,打印 1,然后从集合中减去{2,3,4,5,6},剩下{1,7,8,9,10},所以下一个打印的值应该是 7,最后的结果应该是{1,7,8,9,10}。

但是第一次运行这个循环时,打印的是{1,2,3,4,5,6,7,8,9,10},第二次运行的时候才会打印出{1,7,8,9,10},这一点非常让我疑惑,和预期的完全不同,请问这里的错误出现在那里了?还请大家不吝赐教。

1255 次点击
所在节点    问与答
4 条回复
pompeii
2019-11-02 11:21:16 +08:00
不要在遍历一个容器时增加或删除元素,然后你这个现象可能是循环开始 sets 被保留了一份副本,或者和变量作用域有关,纯猜测哈
alphabeta
2019-11-02 11:25:36 +08:00
@pompeii #1 感谢回复,但是有些情况下确实需要动态的去调整容器中的元素,减少筛选的范围等等,暂时想不到其它可以代替的方法。
jmc891205
2019-11-02 11:34:35 +08:00
因为 sets - {2,3,4,5,6}会创建一个新的 set
而 for 循环还在使用原来那个 set 的迭代器

你想跳过 2,3,4,5,6 的话 可以另外用一个容器保存这些你想跳过的值 然后在 for 循环的每次迭代一开始检查当前值是不是在这个容器里 如果是的话就 continue
pompeii
2019-11-02 11:37:22 +08:00
@alphabeta #2 这样的话楼上的方案比较可行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/615505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX