如果我这样做:

>>> 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]  # prints true

写作:

not(True) in [False, True]

是一样的:

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

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

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

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

如果你尝试

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

你得到了预期的结果。

让我们把它看作一个集合包含检查操作:[False, True]是一个包含一些元素的列表。

表达式True在[False, True]返回True,因为True是包含在列表中的元素。

因此,[False, True]中的not True给出了“布尔相反”,而不是上述表达式的结果(没有任何括号以保持优先级,因为in的优先级高于not运算符)。 因此,非True将导致False。

另一方面,[False, True]中的(不是True)等于[False, True]中的False,它是True (False包含在列表中)。

为了澄清其他一些答案,在一元操作符后添加括号并不会改变其优先级。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)是完全相同的。