Vik*_*ahl 3 python python-2.x operator-precedence
Python 2 REPL的以下输出让我困惑:
>>> 15>10==True
False
>>> 15>1==True
True
>>> 15>2==True
False
>>> 15>False
True
Run Code Online (Sandbox Code Playgroud)
如果15>10==True被评估为(15>10)==True表达式将简化为print True==True,显然评估为True.如果15>10==True被评估为15>(10==True)简化的表达式15>False也评估为True.这两种解释都与表达式(False)的实际值相矛盾.
我可以理解15>1==True评价,True因为1==True是真的,但没有任何解释15>10==True对我有意义.
简介:在Python 2中,为什么15>10==True评估False?
这是因为Python中的链式比较.即,15>10==True实际上被评估为:
15 > 10 and 10 == True
Run Code Online (Sandbox Code Playgroud)
是的False.
另一方面,15>1==True是一样的
15 > 1 and 1 == True
Run Code Online (Sandbox Code Playgroud)
评估为True.
引用文档:
与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级.与C不同,像<b <c这样的表达式具有在数学中常规的解释:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
Run Code Online (Sandbox Code Playgroud)
比较产生布尔值:True或False.
比较可以任意链接,例如,x <y <= z等于x <y和y <= z,除了y仅被评估一次(但在两种情况下,当x <y被发现时,根本不评估z是假的).
形式上,如果a,b,c,...,y,z是表达式而op1,op2,...,opN是比较运算符,则op1 b op2 c ... y opN z等效于op1 b和b op2 c和... y opN z,除了每个表达式最多被评估一次.
注意,op1 b op2 c并不意味着a和c之间的任何比较,因此,例如,x <y> z是完全合法的(尽管可能不是很漂亮).
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |