2011-05-23 40 views
31

将Python中的布尔值与==进行比较。但是,当我申请布尔not操作,结果是一个语法错误:为什么'True == not False'是Python中的语法错误?

Python 2.7 (r27:82500, Sep 16 2010, 18:02:00) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> True == True 
True 
>>> False == False 
True 
>>> True is not False 
True 
>>> True == not False 
    File "<stdin>", line 1 
    True == not False 
      ^
SyntaxError: invalid syntax 
>>> 

为什么这是一个语法错误?我期望not False是一个返回布尔值的表达式,并且True == <x><x>是具有有效语法的表达式时是有效的语法。

+7

注意,说:“真不假”是*不*同为“真正的(不假)”。 “不是”是一个独特的运算符,意思是“不相同”,而“真(非)”读作“真与否是假的相同”。只是一句话,因为你的榜样似乎就像你会假设的那样,两者都是一样的。 – lunaryorn 2011-05-23 17:12:41

+0

'True == not'是实际的语法错误,之后的任何内容都是不相关的。 – dansalmo 2013-12-28 23:39:26

+2

并且对于记录来说,无论比较的类型是**,任何**比较运算符都加上'not',**都会失败。 'True not'False'','3.3> = not 4.5','{}不是[]','set()== not None'和'slice()!= not lambda:x' ** all **引发相同的语法错误。这不仅限于'== not'和布尔值。 – 2014-01-31 17:12:15

回答

45

它与operator precedence in Python(口译员认为你比较真,没有,因为==not有更高的优先级)。你需要一些括号来阐明操作顺序:

True == (not False) 

一般情况下,在比较的右侧没有括号不能使用not。但是,我无法想象在比较的右侧需要使用not的情况。

+1

是否有运营商优先的原因,还是只是一个愚蠢的“功能”? Wow; – 2011-05-23 16:52:07

+0

哇;这很有趣。我无法想象任何其他语言,我知道否定具有如此低的优先级,当然不低于平等! – verdesmarald 2011-05-23 16:54:39

+0

@Jim:从历史上看,尤其是来自数学,大多数编程语言的运算符优先级大多是任意的。至少在加法和乘法之外。 – Joey 2011-05-23 16:55:12

10

这只是运营商优先权的问题。

尝试:

>>> True == (not False) 
True 

有在this table of operator precedences一看,你会发现,==结合比not tigher,从而True == not False被解析为(True == not) False这显然是一个错误。

1

我认为你要找的是“而不是”。这给你你正在寻找的结果。如果你的比较布尔值是一个复合布尔表达式,下面是一个示例网站Compound Boolean Expression

>>> True and True 
True 
>>> True and not True 
False 
>>> True and not False 
True 
>>> False and not True 
False 
>>> False and not False 
False 
>>> False and False 
False 
相关问题