2013-05-05 73 views
3

我經常遇到,大多數人的函數或方法來管理默認參數值是這樣的:慣用的蟒蛇,管理功能的默認參數

def foo(L=None): 
    if L is None: 
    L = [] 

但是我看其他人做這樣的事情:

def foo(L=None): 
    L = L or [] 

我不知道是否缺少一些東西,但爲什麼大多數人使用第一種方法而不是第二種?他們是同樣的東西嗎?看起來第二個更清晰更短。

回答

6

它們不相等。 第一種方法確切地檢查,給出參數LNone。 第二次檢查,L在Python中是真的。在Python中,如果在條件檢查列表,規則如下:

  1. 列表是空的,那麼它是假
  2. 真,否則

那麼什麼是提到的方法之間的區別?比較這段代碼。

第一:

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 
[] 

因此,首先並沒有創造一個新的列表,它使用了給定的列表。但是第二個創建了新的。

0

也許他們不知道第二個?我傾向於使用第一個。

其實是有區別的。第二個將讓L = []如果你傳遞任何計算結果爲布爾假。 0空串或其他。第一個只會在沒有L被傳遞或者被傳遞爲None時做。

1

如果參數是false-y值,則兩者不等價。這並不常見,因爲很多false-y值對於大多數功能來說都不合適,因此您可以這樣做。儘管如此,還是有可能的情況。例如,如果一個函數應該填充一個字典(如果沒有給出一個新字典,則創建一個新字典),並且某人傳遞一個空的有序字典,那麼後一種方法會錯誤地返回一個普通字典。

這不是我始終使用is None版本的主要原因。我更喜歡它,因爲它更明確,並且or返回其操作數之一的事實對我而言並不直觀。我只要我可以忘記它;-)額外的線不是問題,這是相對罕見的。