V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
alphabeta
V2EX  ›  问与答

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

  •  
  •   alphabeta · 2019-11-02 11:14:14 +08:00 · 1225 次点击
    这是一个创建于 1841 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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},这一点非常让我疑惑,和预期的完全不同,请问这里的错误出现在那里了?还请大家不吝赐教。

    4 条回复    2019-11-02 11:37:22 +08:00
    pompeii
        1
    pompeii  
       2019-11-02 11:21:16 +08:00
    不要在遍历一个容器时增加或删除元素,然后你这个现象可能是循环开始 sets 被保留了一份副本,或者和变量作用域有关,纯猜测哈
    alphabeta
        2
    alphabeta  
    OP
       2019-11-02 11:25:36 +08:00
    @pompeii #1 感谢回复,但是有些情况下确实需要动态的去调整容器中的元素,减少筛选的范围等等,暂时想不到其它可以代替的方法。
    jmc891205
        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
    pompeii
        4
    pompeii  
       2019-11-02 11:37:22 +08:00
    @alphabeta #2 这样的话楼上的方案比较可行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:41 · PVG 14:41 · LAX 22:41 · JFK 01:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.