如果我这样做:
>>> 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?
当前回答
运算符优先级为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
让我们把它看作一个集合包含检查操作:[False, True]是一个包含一些元素的列表。
表达式True在[False, True]返回True,因为True是包含在列表中的元素。
因此,[False, True]中的not True给出了“布尔相反”,而不是上述表达式的结果(没有任何括号以保持优先级,因为in的优先级高于not运算符)。 因此,非True将导致False。
另一方面,[False, True]中的(不是True)等于[False, True]中的False,它是True (False包含在列表中)。
它在[False, True]中计算为非True,返回False,因为[False, True]中为True
如果你尝试
>>>(not(True)) in [False, True]
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])。