2013-02-14 157 views
1

我發現下面的代碼片段:「長度和長度」與Python中的「長度」有什麼不同?

length = length and length or len(string) 

要我看來,這應該是等同於:

length = length or len(string) 

我可以摺疊的表達length and length僅僅是length或者我會得到在某些情況下有不同的結果?

+0

'如果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

+0

@MartijnPieters是的,我錯了!但是,似乎該語句不考慮「length」或「string」的值而使「length」的值保持不變。我不知道威廉在哪裏看到了代碼片段... – pradyunsg 2013-02-14 18:26:10

+0

@MartijnPieters刷新了一點時間...... :) – pradyunsg 2013-02-14 18:30:24

回答

3

這條線是無稽之談。讓我們來看看我們的選項:

  • 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是無操作。

+0

......這正是他所問的。我很高興你更正了你的答案,我正要抱怨。 – 2013-02-14 18:33:34

+0

@ChrisMorgan:'+++出咖啡因錯誤+++從開始+++重做'。 – 2013-02-14 18:34:16

+0

對不起,Python本身不支持異常機制中的「重試」構造。嘗試一種不同的語言。 – 2013-02-14 18:35:18

2

length and length or len(string)完全等同於length or len(string)。我認爲,編寫此代碼的人希望在length爲虛假時避免撥打len(string),但事實並非如此。例如:

>>> None and None or len('foo') 
3 

由於andor有更高的優先級,我們可以重寫表達式如下:

(length and length) or len('foo') 

length and length將始終評估爲length,所以這兩個表達式是相同的。

+3

*我認爲正在做的事情是作者熟悉「x和y或z」幾乎是三元的表達習慣用法,只是沒有想到就應用了它。 – 2013-02-14 18:34:17