alphabeta
V2EX  ›  问与答

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

  •  
  •   alphabeta · Nov 2, 2019 · 1905 views
    This topic created in 2401 days ago, the information mentioned may be changed or developed.

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

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

    你想跳过 2,3,4,5,6 的话 可以另外用一个容器保存这些你想跳过的值 然后在 for 循环的每次迭代一开始检查当前值是不是在这个容器里 如果是的话就 continue
    pompeii
        4
    pompeii  
       Nov 2, 2019
    @alphabeta #2 这样的话楼上的方案比较可行
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   866 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:14 · PVG 04:14 · LAX 13:14 · JFK 16:14
    ♥ Do have faith in what you're doing.