處理可選列表參數的常規方法如下:可選列表參數「列表=列表或[]」在Python
def func(list_of_vals = None):
if list_of_vals is None:
list_of_vals = []
...
我wounder如果下面的(短)的版本有什麼缺陷?爲什麼沒有人這樣做?它被認爲比較隱晦嗎?
list_of_vals = list_of_vals or []
處理可選列表參數的常規方法如下:可選列表參數「列表=列表或[]」在Python
def func(list_of_vals = None):
if list_of_vals is None:
list_of_vals = []
...
我wounder如果下面的(短)的版本有什麼缺陷?爲什麼沒有人這樣做?它被認爲比較隱晦嗎?
list_of_vals = list_of_vals or []
使用None
與if語句因爲這是通常的結合,它是熟悉Python開發者,也沒有怪異的邊緣情況。 我的建議只是堅持與公約。
你在這裏使用or
操作邏輯的提議從邊緣情況bool(list_of_vals) == False
但list_of_vals is not None
傳統的解決方案偏離,所以我會使用建議對。
另一個可能的選擇是使用一個空的元組:
def a(vals=()):
...
因爲元組是不可變的,這有沒有一個可變的默認列表中的陷阱。有許多用例只需要迭代和索引輸入容器,並且vals
可以愉快地保留爲元組。
如果你確實需要在函數體內部使用一個列表,例如你需要追加或彈出項目,那麼你將添加vals = list(vals)
作爲函數的第一行。
有兩種情況,你想要的清單可以在函數外被改變,那麼第二個變種阻止調用a
有:
some_list = []
a(some_list)
print(some_list)
如果你想阻止列表參數的交替,你應該在裏面做一個副本a
def a(l=()):
l = list(l)
我這樣做,我覺得很棒。體面的python程序員會理解它。但是使用'l'作爲變量名,這很糟糕。 –
@AlexHall,當然,這只是一個示例代碼來說明一個想法 –
這是非常普遍的。它也是JS的標準。實際上,Typescript中的默認參數編譯成上面的代碼,但在JS中。任何人,即使是遠程熟練的語言都會知道你在做什麼。 – Carcigenicate