2016-11-05 54 views
2

我在Python中發現了一些非常奇怪的行爲。 我的一個學生做出某種錯誤試圖找到屬於兩個列表元素,他寫道:和Python列表上的運算符

list1 and list2 

奇怪的行爲是沒有錯誤被Python 3被解僱了! list1 and list2實際上得到的值是list2

是否有任何已知的原因呢?

回答

4

and只是評估提供的兩個值的真實性。 如果第一個是True(請參閱bool(list1)),則第二個評估和返回。如果第一個參數是False(例如[] and list2),它的值將立即返回。

documentation on Boolean Operations這種行爲的理由作了明確規定:

注意,無論是and也不or限制他們回到FalseTrue的價值和類型,而是返回最後一個變量。這有時是有用的,例如,如果s是一個字符串,如果該字符串爲空,則應該使用默認值替換,則表達式s or 'foo'會生成所需的值。

(重點煤礦)

請注意,這種行爲沒有找到not它,而是返回根據所提供的參數一True/False值。

+0

非常感謝。這正是我不明白的地方。 –

+1

不客氣@Coulombeau。總是在Python文檔中查看這樣的行爲,它通常隱藏在某處:-) –

1

那麼,如果他們都有值,那麼「if list1和list2:」應該返回True,它會繼續到代碼中的下一行。

a = 1 
if a: #This will be True since a is different then None or 0 
    print("Works") 
>>> Works 

b = 0 
if b: 
    print("Works") 
>>> 
This one returned nothing because b is 0 wich means that the "if b" will return False. 

另外,它會返回上列出真如果該列表中有ATLEAST 1元素:如果一個變量是不同的,那麼沒有或0 例 Python3認爲真。

1

當您詢問list1 and list2時,python會呼叫__bool__,list1list2。由於[]的計算結果爲False,並且非空列表的計算結果爲True,and依次查看list1list2,直到它找到一個空列表(或者它查找所有列表,如果從未找到空列表)。

最後,and表達式的計算結果爲導致and失敗的空列表或比較中的最後一個列表。這就是爲什麼你得到list2作爲價值。

有趣的是,你可以使用這個行爲,你的優勢來設置默認值:

def func(arg=None): 
    arg = arg or [5] # now, [5] is the default value of arg 

這幾乎是一樣的做:

def func(arg=None): 
    if arg is None: 
     arg = [5]