为什么“False,True]中的”not(True)“返回False?

时间:2015-07-15 04:12:58

标签: python python-2.7 python-3.x

如果我这样做:

>>> False in [False, True]
True

返回True。只是因为False在列表中。

但如果我这样做:

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

返回Falsenot(True)等于False

>>> not(True)
False

为什么?

8 个答案:

答案 0 :(得分:719)

运算符优先级 2.x3.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 precedenceposition: 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个角色(precedencechaining)来分隔它,在这种情况下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]TrueFalse包含在列表中)。

答案 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)

因为-2not(True)相同。括号什么都不做。 Anim完全相同。