我在Python中發現了一些非常奇怪的行爲。 我的一個學生做出某種錯誤試圖找到屬於兩個列表元素,他寫道:和Python列表上的運算符
list1 and list2
奇怪的行爲是沒有錯誤被Python 3被解僱了! list1 and list2
實際上得到的值是list2
。
是否有任何已知的原因呢?
我在Python中發現了一些非常奇怪的行爲。 我的一個學生做出某種錯誤試圖找到屬於兩個列表元素,他寫道:和Python列表上的運算符
list1 and list2
奇怪的行爲是沒有錯誤被Python 3被解僱了! list1 and list2
實際上得到的值是list2
。
是否有任何已知的原因呢?
and
只是評估提供的兩個值的真實性。 如果第一個是True
(請參閱bool(list1)
),則第二個評估和返回。如果第一個參數是False
(例如[] and list2
),它的值將立即返回。
在documentation on Boolean Operations這種行爲的理由作了明確規定:
注意,無論是
and
也不or
限制他們回到False
和True
的價值和類型,而是返回最後一個變量。這有時是有用的,例如,如果s
是一個字符串,如果該字符串爲空,則應該使用默認值替換,則表達式s or 'foo'
會生成所需的值。
(重點煤礦)
請注意,這種行爲沒有找到與not
它,而是返回根據所提供的參數一True
/False
值。
那麼,如果他們都有值,那麼「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認爲真。
當您詢問list1 and list2
時,python會呼叫__bool__
,list1
和list2
。由於[]
的計算結果爲False
,並且非空列表的計算結果爲True
,and
依次查看list1
和list2
,直到它找到一個空列表(或者它查找所有列表,如果從未找到空列表)。
最後,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]
非常感謝。這正是我不明白的地方。 –
不客氣@Coulombeau。總是在Python文檔中查看這樣的行爲,它通常隱藏在某處:-) –