2016-03-29 49 views
3

在下面的代碼片段功能f被按預期執行:Python的 - 短路奇怪的行爲

def f(): 
    print('hi') 
f() and False 
#Output: 'hi' 

但在隨後的類似的代碼片段a不會增加:

a=0 
a+=1 and False 
a 
#Output: 0 

但是,如果我們用True代替虛假的短路a得到遞增:

a=0 
a+=1 and True 
a 
#Output: 1 

短路如何以這種方式運行?

回答

8

這是因爲f() and False是而a += 1 and False表達式(技術上單表達式語句)是一個賦值語句。它實際上解決到a += (1 and False),並且因爲1 and False等於FalseFalse實際上是整數0,會發生什麼是a += 0,一個無操作。

(1 and True)然而,評估爲True(這是整數1),所以a += 1 and True意味着a += 1

(也注意到,Python的andor總是返回第一個操作數,可以明確地確定了化經營的結果)

+1

可能值得澄清一下「(1和True)」計算爲「True」,它是整數1。 –

+0

確實。接得好。 –

+0

作爲'+'運算符具有[更高的優先級],不應將'a + = 1和False'解析爲'a =(a + 1)和False'(https://docs.python.org/3/reference/ expressions.html#operator-precedence),那麼整個表達式解析爲'a = False'? – Hidden

0

我相信

a+=1 and False 

相當於

a+=(1 and False) 

a+=1 and True 

相當於

a+=(1 and True) 

例如:

In [15]: a = 0 

In [16]: a+=2 and True 

In [17]: a 
Out[17]: 1 
+0

是的,就是這樣。在python中,賦值不會像C中那樣返回值。 – beezz