2016-08-16 60 views
0

我想避免在創建一個對象的新實例並使用該對象之後修改用戶參數。在這裏好的做法是立即複製init()方法中的關鍵參數,還是有更好的解決方案?避免在__init__方法中通過deepcopy更改用戶參數?

這裏是一個具體的例子:

import copy 
class Myclass: 
    def __init__(self, x): 
     self.x = copy.deepcopy(x) 

    def change(self): 
     self.x[0] += 1 


>>> x = [0] 
>>> C = Myclass(x) 
>>> C.change() 
>>> print(x) 
0 
+0

我無法重現這一點。你使用的是什麼版本的Python? –

+1

這不是一個實踐問題。如果你需要複製,那麼你需要複製。沒有什麼更多。 – freakish

+3

我的意見是,複製應該通常是調用者的責任。這在用戶不關心輸入的內容是否改變(可能通過將該責任推回到調用者上來避免)的常見情況(可能)中引入開銷。這就是說,實用性有時會打敗人們的純潔性,如果你想這樣做是出於實際的原因,那麼可能沒有比你在這裏暗示的更好的方法。 – mgilson

回答

1

流利的Python的作者 - 盧西亞諾·拉馬略 - 有例子在他的__init__.py應對的書,我會傾斜與他aggree。

但是他沒有使用深度複製,他只是利用了可以用另一個來初始化一個列表。爲您節省一筆import

class MyClass: 
    def __init__(self, options: list): 
     self.options = list(options)  

好書;強烈推薦。

+0

'list(options)'與'copy.copy(options)'基本相同(都是淺拷貝)。使用'x = [object()]',將'x'與'list(x)','copy.copy(x)'和'copy.deepcopy(x)'進行比較。 – chepner

+0

啊是的,我沒有考慮嵌套對象。我正在從給定的例子使用一個Int – freebie

相關問題