为什么在[False,True]中不是(True)“返回False?

如果我这样做:

>>> False in [False, True]
True

这返回True 。 只是因为False在列表中。

但是,如果我这样做:

>>> not(True) in [False, True]
False

这返回False 。 而not(True)等于False

>>> not(True)
False

为什么?


运算符优先级 2.x,3.x. 优先级not低于in 。的优先级。 所以它相当于:

>>> not (True in [False, True])
False

这是你想要的:

>>> (not True) in [False, True]
True

正如@Ben指出的那样:建议不要写not(True) ,不要写not True 。 前者使它看起来像一个函数调用,而not一个操作符,而不是一个函数。


not x in y中的x not in y被评估为x not in y

您可以通过反汇编代码来查看究竟发生了什么。 第一个案例按照您的预期工作:

>>> x = lambda: False in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (False)
              3 LOAD_GLOBAL              0 (False)
              6 LOAD_GLOBAL              1 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               6 (in)
             15 RETURN_VALUE

第二种情况,评估结果True not in [False, True] ,这是False

>>> x = lambda: not(True) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_GLOBAL              1 (False)
              6 LOAD_GLOBAL              0 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               7 (not in)
             15 RETURN_VALUE        
>>> 

你想表达的却是(not(True)) in [False, True]这符合市场预期,是True ,并且你可以看到为什么:

>>> x = lambda: (not(True)) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 UNARY_NOT           
              4 LOAD_GLOBAL              1 (False)
              7 LOAD_GLOBAL              0 (True)
             10 BUILD_LIST               2
             13 COMPARE_OP               6 (in)
             16 RETURN_VALUE        

运算符优先级。 in绑定比not更紧密,所以你的表达不等于not((True) in [False, True])

链接地址: http://www.djcxy.com/p/40931.html

上一篇: Why does "not(True) in [False, True]" return False?

下一篇: Simple Inherit from class in Python throws error