如果我这样做:

>>> False in [False, True]
True

返回True。很简单,因为False在列表中。

但如果我这样做了:

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

返回False。鉴于not(True)等于False:

>>> not(True)
False

Why?


当前回答

运算符优先级为2。3. x, x。not优先级低于in。所以它等价于:

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

这是你想要的:

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

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

其他回答

它在[False, True]中计算为非True,返回False,因为[False, True]中为True

如果你尝试

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

你得到了预期的结果。

运算符优先级为2。3. x, x。not优先级低于in。所以它等价于:

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

这是你想要的:

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

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

这完全是关于操作符优先级(in比not强)。但只要在正确的位置加上括号,就可以很容易地纠正这个错误:

(not(True)) in [False, True]  # prints true

写作:

not(True) in [False, True]

是一样的:

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

它会查看True是否在列表中,并返回结果的“not”。

y中的非x等于y中的非x

通过分解代码,您可以确切地看到发生了什么。第一种情况如你所料:

>>> 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

第二种情况,在[False, True]中评估为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        
>>> 

你想表达的是[False, True]中的(not(True)),而[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])。