2016-06-30 91 views
2

我想要做一個函數的一些列表修改,然後繼續調用該函數,這是更好的方法來做到這一點後,使用修改後的列表:我應該明確地從函數返回列表嗎?

def modify(alist): 
    alist.append(4) 
alist = [1,2,3] 
modify(alist) 
alist.append(5) 

或者這樣:

def modify(alist): 
    alist.append(4) 
    return alist 
alist = [1,2,3] 
alist = modify(alist) 
alist.append(5) 

是第一種壞音嗎?

+0

取決於您的「更好」的標準以及如何確定代碼的「語調」。 –

+1

不,第一個很好 - Python函數改變可變參數的狀態,通常是'返回None'(顯式或隱式) - *就像'.append'本身!* – jonrsharpe

+0

類似於http://stackoverflow.com/問題/ 26027694 /正確的樣式爲python-functions-that-mutate-the-argument – Deca

回答

0

從函數返回列表是安全的!

+0

非常感謝@Jack! –

0

由於您正在修改列表inplace,因此返回已修改的相同列表沒有多大意義。

就地突變傳播從參考list,所以最好還是離開了return聲明,如果一個地方在函數中發生錯誤引發異常,但不return修改的對象。

應該有一個 - 最好只有一個 - 明顯的方法來做到這一點。

+1

您不應該*「返回指示突變狀態的值」* - 如果操作失敗,引發異常。 – jonrsharpe

+0

@jonrsharpe Brainfart。沒有注意。謝謝! –

1

通常功能應該返回它生成的結果。然而,當你通過一個列表,你需要做一個拷貝的列表或接受它將被修改的事實;返回修改後的列表是多餘的。如果您提供默認參數,它也會導致問題,因爲默認值也會被修改。

我通常更喜歡使參數只讀,除非很明顯他們將被修改就地。

我的建議:

def modify(alist=[]): 
    alist = alist[:] # make a copy 
    alist.append(4) 
    return alist 
-1

從形式上看,這兩種方法fullfil希望任務 - 修改列表。

但是,函數return存儲在變量中的某些值的第二種方法更安全,而且這樣的代碼更易於維護和開發,特別是如果您有許多要修改的列表時。或者通常你有一個代碼解決了一些困難的任務,爲此你需要很多的功能和變量。 「安全」意味着您不必擔心代碼中的變量名稱衝突 - 您在函數名稱空間內創建的所有內容都保持本地化(除了創建類屬性時的情況)。所以,這通常被認爲是一種更好的做法。祝你好運!

+0

羽絨選民,想解釋一下嗎?我的推理有什麼問題嗎?然後,Plaese正確。 –

相關問題