我發現下面的代碼片段:「長度和長度」與Python中的「長度」有什麼不同?
length = length and length or len(string)
要我看來,這應該是等同於:
length = length or len(string)
我可以摺疊的表達length and length
僅僅是length
或者我會得到在某些情況下有不同的結果?
我發現下面的代碼片段:「長度和長度」與Python中的「長度」有什麼不同?
length = length and length or len(string)
要我看來,這應該是等同於:
length = length or len(string)
我可以摺疊的表達length and length
僅僅是length
或者我會得到在某些情況下有不同的結果?
這條線是無稽之談。讓我們來看看我們的選項:
length
是falsy(所以0
,一個空列表,空字符串,等等)。 Python將返回length
的值,因爲無論右側的計算結果如何,and
運算符評估爲False
都沒有意義,因爲沒有必要查看錶達式的其餘部分。然後測試length or len(string)
並返回len(string)
。
length
不是假的。 Python評估length and length
,將其解析爲length
的值,然後測試length or len(string)
,並且因爲length
是truthy,返回length
。畢竟,or
現在總是會解決到True
,並沒有看點len(string)
。
這基本上可以歸結爲length = length or len(string)
,該length and length
是無操作。
......這正是他所問的。我很高興你更正了你的答案,我正要抱怨。 – 2013-02-14 18:33:34
@ChrisMorgan:'+++出咖啡因錯誤+++從開始+++重做'。 – 2013-02-14 18:34:16
對不起,Python本身不支持異常機制中的「重試」構造。嘗試一種不同的語言。 – 2013-02-14 18:35:18
length and length or len(string)
完全等同於length or len(string)
。我認爲,編寫此代碼的人希望在length
爲虛假時避免撥打len(string)
,但事實並非如此。例如:
>>> None and None or len('foo')
3
由於and
比or
有更高的優先級,我們可以重寫表達式如下:
(length and length) or len('foo')
length and length
將始終評估爲length
,所以這兩個表達式是相同的。
*我認爲正在做的事情是作者熟悉「x和y或z」幾乎是三元的表達習慣用法,只是沒有想到就應用了它。 – 2013-02-14 18:34:17
'如果length:length = length或len(string)else:length = False'將等於您的'length = length和length或len(string)'。而且,'length或len(string)'可以給出'len(string)'的值。 – pradyunsg 2013-02-14 18:20:56
@MartijnPieters是的,我錯了!但是,似乎該語句不考慮「length」或「string」的值而使「length」的值保持不變。我不知道威廉在哪裏看到了代碼片段... – pradyunsg 2013-02-14 18:26:10
@MartijnPieters刷新了一點時間...... :) – pradyunsg 2013-02-14 18:30:24