2013-10-29 25 views
11

將空元組用作函數的可迭代參數的默認值是否有任何缺點?假設你在函數中想要的是一個不可變的迭代器。 例如在函數中使用空元組作爲默認可迭代參數

def foo(a, b=()): 
    print a 
    for x in b: 
    print x 

我似乎無法找到這個用例的很多例子。

+0

是否功能做任何事'for'循環外? – DSM

+0

不,我假設你想在函數中是一個不可變的迭代器。 – Ben

+1

我錯過了什麼嗎?使用默認參數的唯一方法是如果您手動將不帶參數的'foo'稱爲'foo()'。但是如果你知道這個函數只有在迭代器不是空的時候纔會執行任何操作,那麼爲什麼你會這樣寫呢? – DSM

回答

9

我想不出任何缺點,因爲當你需要一個不可改變的迭代。我認爲它並沒有被使用,因爲default_list=Nonedefault_list = default_list or None模式是用於可變的可迭代項的模式,並且當迭代器不可變時,人們不會在更不經常發生的情況下更改它(因爲沒有真正的需要) 。與可變默認參數一樣,肯定沒有意外的行爲。

1

將默認設計爲不可變的空元組沒有固有問題。但是,它可以被認爲是一種非直觀的設計方法。對元組中特定位置的任何引用都會導致引發異常。如果你足夠小心地創建參數檢查,那麼這不會是一個問題,但是如果你構建了其他代碼以期望來自特定位置的數據並且不驗證元組爲空,那麼這將導致錯誤。

這取決於你的目標是什麼論點。一個空的列表會有一個默認參數(至少是那些以某種方式修改列表的)更明顯的應用程序,但是一個空的不可變元組除了指示沒有參數被賦值外,不會有任何直觀的用途作爲默認參數。

默認參數的典型方法是將它們設置爲這使得它非常清楚,當參數尚未設置:

def foo(a, b=None): 
相關問題