在下面的代碼片段功能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
短路如何以這種方式運行?
在下面的代碼片段功能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
短路如何以這種方式運行?
這是因爲f() and False
是而a += 1 and False
表達式(技術上單表達式語句)是一個賦值語句。它實際上解決到a += (1 and False)
,並且因爲1 and False
等於False
和False
實際上是整數0,會發生什麼是a += 0
,一個無操作。
(1 and True)
然而,評估爲True
(這是整數1),所以a += 1 and True
意味着a += 1
。
(也注意到,Python的and
和or
總是返回第一個操作數,可以明確地確定了化經營的結果)
我相信
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
是的,就是這樣。在python中,賦值不會像C中那樣返回值。 – beezz
可能值得澄清一下「(1和True)」計算爲「True」,它是整數1。 –
確實。接得好。 –
作爲'+'運算符具有[更高的優先級],不應將'a + = 1和False'解析爲'a =(a + 1)和False'(https://docs.python.org/3/reference/ expressions.html#operator-precedence),那麼整個表達式解析爲'a = False'? – Hidden