如果我这样做:
>>> False in [False, True]
True
返回True
。只是因为False
在列表中。
但如果我这样做:
>>> not(True) in [False, True]
False
返回False
。 not(True)
等于False
:
>>> not(True)
False
为什么?
答案 0 :(得分:719)
运算符优先级 2.x,3.x 。 True
的优先级低于not
的优先级。所以它相当于:
in
这就是你想要的:
>>> not ((True) in [False, True])
False
正如@Ben所指出的:建议永远不要写>>> (not True) in [False, True]
True
,而不是not(True)
。前者使它看起来像一个函数调用,而not True
是一个操作符,而不是一个函数。
答案 1 :(得分:73)
not x 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
答案 2 :(得分:35)
运营商优先权。 in
绑定比not
更紧密,因此您的表达式等同于not((True) in [False, True])
。
答案 3 :(得分:33)
所有关于operator precedence(position: absolute
强于in
)。但是可以通过在正确的位置添加括号来轻松纠正:
not
写作:
(not(True)) in [False, True] # prints true
与:
相同not(True) in [False, True]
查看列表中是否有not((True) in [False, True])
并返回结果的“not”。
答案 4 :(得分:14)
评估为not True in [False, True]
,返回False
,因为True
位于[False, True]
如果您尝试
>>>(not(True)) in [False, True]
True
你得到了预期的结果。
答案 5 :(得分:13)
除了提到not
的优先级低于in
的其他答案外,实际上您的陈述相当于:
not (True in [False, True])
但请注意,如果你不将你的条件与其他条件分开,python将使用2个角色(precedence
或chaining
)来分隔它,在这种情况下python使用优先级。另请注意,如果要分离条件,则需要将所有条件放在括号中,而不仅仅是对象或值:
(not True) in [False, True]
但如上所述,python对运营商进行了另一项修改链接:
基于python documentation:
请注意,比较,成员资格测试和身份测试都具有相同的优先级,并具有从左到右链接功能,如比较部分所述。
例如,以下语句的结果为False
:
>>> True == False in [False, True]
False
因为python会链接如下语句:
(True == False) and (False in [False, True])
False and True
到底是False
。
您可以假设中心对象将在2个操作和其他对象之间共享(在这种情况下为False)。
请注意,对于所有比较,它也适用,包括跟随操作数的成员资格测试和身份测试操作:
in, not in, is, is not, <, <=, >, >=, !=, ==
示例:
>>> 1 in [1,2] == True
False
另一个着名的例子是数字范围:
7<x<20
等于:
7<x and x<20
答案 6 :(得分:6)
让我们将其视为集合包含检查操作:[False, True]
是包含一些元素的列表。
表达式True in [False, True]
返回True
,因为True
是列表中包含的元素。
因此,not True in [False, True]
给出了上述表达式的“boolean opposite”,not
结果(没有任何括号来保留优先级,因为in
的优先级高于not
运营商)。
因此,not True
会产生False
。
另一方面,(not True) in [False, True]
等于False in [False, True]
,True
(False
包含在列表中)。
答案 7 :(得分:6)
要澄清其他一些答案,在一元运算符后添加括号不会改变其优先级。 not(True)
not
不会使True
更紧密地绑定到True
。它只是(True) in [True, False]
周围的一组冗余括号。它与(not True) in [True, False]
大致相同。括号不做任何事情。如果希望绑定更紧密,则必须将括号放在整个表达式周围,这意味着运算符和操作数,即>>> -2**2
-4
。
要看到另一种方式,请考虑
**
-
比>>> (-2)**2
4
更紧密地绑定,这就是为什么你得到两个平方的负数,而不是负二的平方(这将是正四)。
如果你确实想要负二的平方怎么办?显然,你要添加括号:
4
但是,期望以下内容提供>>> -(2)**2
-4
-(2)
因为-2
与not(True)
相同。括号什么都不做。 Anim
完全相同。