2016-08-16 6 views
0

私は、オブジェクトの新しいインスタンスを作成してオブジェクトを操作した後に、ユーザーの引数が変更されるのを避けたいと考えています。 init()メソッドの重要な引数をすぐにコピーするのが良い方法ですか、それとも良い方法がありますか?ルチアーノRamalho - - __init__.pyに対処する彼の本に例があり、私は彼と一緒にaggreeする傾斜になるだろう__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の作者は:ここ

は具体例です。

しかし、ディープコピーは使用しませんが、別のリストでリストを初期化できるという利点があります。あなたに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

関連する問題