代码之家  ›  专栏  ›  技术社区  ›  avacariu

If循环:“x不在”vs.“x不在”[重复]

  •  49
  • avacariu  · 技术社区  · 14 年前

    我注意到这两种方法都是一样的:

    if x not in list if not x in list

    在某些情况下两者之间有什么区别吗?两者兼有是有原因的,还是仅仅因为有些人写一个或另一个比较自然?

    我更可能在别人的代码中看到哪一个?

    5 回复  |  直到 4 年前
        1
  •  78
  •   Alex Martelli    14 年前

    >>> import dis
    >>> dis.dis(compile('if x not in d: pass', '', 'exec'))
      1           0 LOAD_NAME                0 (x)
                  3 LOAD_NAME                1 (d)
                  6 COMPARE_OP               7 (not in)
                  9 JUMP_IF_FALSE            4 (to 16)
                 12 POP_TOP             
                 13 JUMP_FORWARD             1 (to 17)
            >>   16 POP_TOP             
            >>   17 LOAD_CONST               0 (None)
                 20 RETURN_VALUE        
    >>> dis.dis(compile('if not x in d: pass', '', 'exec'))
      1           0 LOAD_NAME                0 (x)
                  3 LOAD_NAME                1 (d)
                  6 COMPARE_OP               7 (not in)
                  9 JUMP_IF_FALSE            4 (to 16)
                 12 POP_TOP             
                 13 JUMP_FORWARD             1 (to 17)
            >>   16 POP_TOP             
            >>   17 LOAD_CONST               0 (None)
                 20 RETURN_VALUE        
    

    所以很明显它们在语义上是相同的。

    PEP 8

    就我个人而言,我非常喜欢 if x not in y 形式——这让我们立刻明白 not in 只有一个操作员, if not x in y 可能会误导一些读者认为这意味着 if (not x) in y ,读起来有点不像英语,绝对没有什么优势。

        2
  •  7
  •   killown    14 年前
    >>> dis.dis(lambda: a not in b)
    1           0 LOAD_GLOBAL              0 (a)
              3 LOAD_GLOBAL              1 (b)
              6 COMPARE_OP               7 (not in)
              9 RETURN_VALUE      
    
    >>> dis.dis(lambda: not a in b)
    1           0 LOAD_GLOBAL              0 (a)
              3 LOAD_GLOBAL              1 (b)
              6 COMPARE_OP               7 (not in)
              9 RETURN_VALUE  
    

    所以,正确的方法是“a不在b”。

        3
  •  3
  •   habnabit dwc    14 年前

    not x in L 并没有明确禁止,因为那样做是愚蠢的。 x not in L 是显式允许的(尽管它编译成相同的字节码),因为它更可读。

    不过,这是每个人都用的。

        4
  •  3
  •   Mark Byers    14 年前

    a not in b 它正在使用 not in not a in b 使用 in 运算符,然后对结果求反。但是 歪投球 运算符定义为返回与 b中不是a 所以他们做了完全相同的事情。从 documentation :

    歪投球 测试集合成员身份。 x in s x s ,否则为假。 x not in s 返回 .

    a is not b not a is b .

        5
  •  0
  •   Ned Batchelder    14 年前

    这只是个人喜好。你也可以比较一下 if x != 3 if not x == 3 . 你展示的两种表情没有区别。