如果我这样做:

>>> False in [False, True]
True

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

但如果我这样做了:

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

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

>>> not(True)
False

Why?


当前回答

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

其他回答

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

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

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

写作:

not(True) in [False, True]

是一样的:

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

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

为了澄清其他一些答案,在一元操作符后添加括号并不会改变其优先级。not(True)不会使not与True绑定得更紧密。它只是一组多余的圆括号围绕着True。它与[True, False]中的(True)大致相同。括号没有任何作用。如果您希望绑定更紧密,则必须在整个表达式周围加上括号,即操作符和操作数,即[True, False]中的(非True)。

从另一个角度来看,考虑一下

>>> -2**2
-4

**比-结合得更紧密,这就是为什么你得到的是- 2的平方,而不是- 2的平方(即正4)。

如果你想要- 2的平方呢?显然,你要加上括号:

>>> (-2)**2
4

然而,期望下面给出4是不合理的

>>> -(2)**2
-4

因为-(2)等于-2。括号完全没有任何作用。not(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是一个操作符,而不是一个函数。

除了其他提到not优先级低于in的答案外,实际上你的陈述相当于:

not (True in [False, True])

但请注意,如果您不将您的条件与其他条件分离,python将使用2个角色(优先级或链接)来分离它们,在这种情况下,python使用优先级。另外,请注意,如果你想分离一个条件,你需要把所有的条件都放在括号里,而不仅仅是对象或值:

(not True) in [False, True]

但如前所述,python对操作符进行了另一个修改,即链接:

基于python文档:

请注意,比较、成员测试和标识测试都具有相同的优先级,并且具有比较部分中描述的从左到右的链接特性。

例如,下面语句的结果为False:

>>> True == False in [False, True]
False

因为python会像下面这样链接语句:

(True == False) and (False in [False, True])

哪个是假的,哪个是真,哪个是假的。

您可以假设中心对象将在2个操作和其他对象之间共享(在本例中为False)。

请注意,对于所有比较操作,包括成员测试和标识测试操作,这些操作是以下操作数:

in, not in, is, is not, <, <=, >, >=, !=, ==

例子:

>>> 1 in [1,2] == True
False

另一个著名的例子是数字范围:

7<x<20

它等于:

7<x and x<20