我經常遇到,大多數人的函數或方法來管理默認參數值是這樣的:慣用的蟒蛇,管理功能的默認參數
def foo(L=None):
if L is None:
L = []
但是我看其他人做這樣的事情:
def foo(L=None):
L = L or []
我不知道是否缺少一些東西,但爲什麼大多數人使用第一種方法而不是第二種?他們是同樣的東西嗎?看起來第二個更清晰更短。
我經常遇到,大多數人的函數或方法來管理默認參數值是這樣的:慣用的蟒蛇,管理功能的默認參數
def foo(L=None):
if L is None:
L = []
但是我看其他人做這樣的事情:
def foo(L=None):
L = L or []
我不知道是否缺少一些東西,但爲什麼大多數人使用第一種方法而不是第二種?他們是同樣的東西嗎?看起來第二個更清晰更短。
它們不相等。 第一種方法確切地檢查,給出參數L
是None
。 第二次檢查,L在Python中是真的。在Python中,如果在條件檢查列表,規則如下:
那麼什麼是提到的方法之間的區別?比較這段代碼。
第一:
def foo(L=None):
if L is None:
L = []
L.append('x')
return L
>>> my_list = []
>>> foo(my_list)
>>> my_list
['x']
二:
def foo(L=None):
L = L or []
L.append('x')
return L
>>> my_list = []
>>> foo(my_list)
>>> my_list
[]
因此,首先並沒有創造一個新的列表,它使用了給定的列表。但是第二個創建了新的。
也許他們不知道第二個?我傾向於使用第一個。
其實是有區別的。第二個將讓L = []如果你傳遞任何計算結果爲布爾假。 0空串或其他。第一個只會在沒有L被傳遞或者被傳遞爲None時做。
如果參數是false-y值,則兩者不等價。這並不常見,因爲很多false-y值對於大多數功能來說都不合適,因此您可以這樣做。儘管如此,還是有可能的情況。例如,如果一個函數應該填充一個字典(如果沒有給出一個新字典,則創建一個新字典),並且某人傳遞一個空的有序字典,那麼後一種方法會錯誤地返回一個普通字典。
這不是我始終使用is None
版本的主要原因。我更喜歡它,因爲它更明確,並且or
返回其操作數之一的事實對我而言並不直觀。我只要我可以忘記它;-)額外的線不是問題,這是相對罕見的。