如果我这样做:
>>> False in [False, True]
True
返回True。很简单,因为False在列表中。
但如果我这样做了:
>>> not(True) in [False, True]
False
返回False。鉴于not(True)等于False:
>>> not(True)
False
Why?
如果我这样做:
>>> False in [False, True]
True
返回True。很简单,因为False在列表中。
但如果我这样做了:
>>> not(True) in [False, True]
False
返回False。鉴于not(True)等于False:
>>> not(True)
False
Why?
当前回答
让我们把它看作一个集合包含检查操作:[False, True]是一个包含一些元素的列表。
表达式True在[False, True]返回True,因为True是包含在列表中的元素。
因此,[False, True]中的not True给出了“布尔相反”,而不是上述表达式的结果(没有任何括号以保持优先级,因为in的优先级高于not运算符)。 因此,非True将导致False。
另一方面,[False, True]中的(不是True)等于[False, True]中的False,它是True (False包含在列表中)。
其他回答
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])。
为了澄清其他一些答案,在一元操作符后添加括号并不会改变其优先级。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)是完全相同的。
让我们把它看作一个集合包含检查操作:[False, True]是一个包含一些元素的列表。
表达式True在[False, True]返回True,因为True是包含在列表中的元素。
因此,[False, True]中的not True给出了“布尔相反”,而不是上述表达式的结果(没有任何括号以保持优先级,因为in的优先级高于not运算符)。 因此,非True将导致False。
另一方面,[False, True]中的(不是True)等于[False, True]中的False,它是True (False包含在列表中)。
运算符优先级为2。3. x, x。not优先级低于in。所以它等价于:
>>> not ((True) in [False, True])
False
这是你想要的:
>>> (not True) in [False, True]
True
正如@Ben指出的:建议永远不要写not(True),宁愿不写not True。前者使它看起来像一个函数调用,而not是一个操作符,而不是一个函数。