2017-04-07 28 views
1

我在某些代碼中遇到了一個錯誤。的(不正確)線是相似的:爲什麼在兩個列表之間使用「和」會給我第二個列表(而不是錯誤)?

[x for x in range(3, 6) and range(0, 10)] 
print x 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

(寫這句話的正確方法是不是問題的一部分)

想知道什麼someList and someOtherList呢,我嘗試。這似乎結果永遠只能設置爲傳遞的最後一個參數:

x = range(0,3) # [0, 1, 2] 
y = range(3, 10) # [3, 4, 5, 6, 7, 8, 9] 
z = range(4, 8) # [4, 5, 6, 7] 

print x and y  # [3, 4, 5, 6, 7, 8, 9] 
print y and x  # [0, 1, 2] 
print z and y and x # [0, 1, 2] 

我會認爲這是能夠寫一些東西,有用無意的後果,但我真的不看怎麼樣「和」運算符的語義在這裏被應用。

從經驗來看,蟒蛇不會運營商政策適用於那些不支持這些運營商(即它吐出類型錯誤),所以我最好期待上的錯誤和-ING的東西,不應該和-ed。事實上,我沒有得到一個錯誤,告訴我,我錯過了...什麼。

我錯過了什麼?爲什麼list and list是允許的操作?有沒有什麼「有用的」,可以做到這一點?

+1

這個問題是關於布爾值,但答案適用於任何類型 –

+0

謝謝@TimCastelijns – KidneyChris

+0

我確實認爲鏈接問題可能會提及問題不僅僅是布爾列表(它是任何列表),但我並不是真的在這裏增加很多。很高興結束重複。 – KidneyChris

回答

2

and操作員檢查第一個操作數的真實性。如果真實性爲False,則返回第一個參數,否則返回第二個參數。

所以如果兩個range(..)小號包含元素,則返回最後操作。所以,你的表達:

[x for x in range(3, 6) and range(0, 10)] 

等同於:

[x for x in range(0, 10)] 

但是,您可以使用if過濾:

[x for x in range(3, 6) if x in range(0, 10)]

然而range(..)構造一個列表,使它效率不高。因爲我們知道,xint,我們可以做的邊界檢查,如:

[x for x in range(3, 6) if 0 <= x < 10]

當然,在這種情況下,檢查無用因爲range(3,6)每一個元素是在range(0,10)的範圍內。

+0

類似的(通常更有用的)是使用列表上的'或'運算符返回非空的第一個列表。 – Phylogenesis

+0

@Phylogenesis:的確如此。由於'或'返回第一個具有「真」真實性的元素。 –

相關問題