如下代码,先给一个集合赋值:
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},这一点非常让我疑惑,和预期的完全不同,请问这里的错误出现在那里了?还请大家不吝赐教。
1
pompeii 2019-11-02 11:21:16 +08:00
不要在遍历一个容器时增加或删除元素,然后你这个现象可能是循环开始 sets 被保留了一份副本,或者和变量作用域有关,纯猜测哈
|
2
alphabeta OP @pompeii #1 感谢回复,但是有些情况下确实需要动态的去调整容器中的元素,减少筛选的范围等等,暂时想不到其它可以代替的方法。
|
3
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 |