私はリストである属性を持つオブジェクトを持っています。たとえば:python - 値渡しまたは参照渡し
obj.a = [3, 4, 5]
私は、次の動作を取得したいと思います(私は魔法の/ etcを使用して解決策を見つけるために管理することはできません。):もちろん
l = obj.a
obj.a[0] = 2
print(l) --> [3, 4, 5]
print(obj.a) ---> [2, 4, 5]
を私は単純にコピーを使用することができます.deepcopy:
l = copy.deepcopy(obj.a)
しかし、何らかの理由でこの手順を自動化したり、ユーザーのために非表示にしたいと考えています。
[EDIT] のgetAttributeを使用すると、コピーはもちろん、動作しません返す:
import copy
class Test:
def __init__(self):
self.a = []
def __getattribute__(self, attr):
if attr == 'a':
return copy.deepcopy(super(Test, self).__getattribute__(attr))
すべてのヘルプ感謝!
Thnakあなた、 トーマス
コピー時にリストを明示的にコピーしないと、コピーで作業していないときに操作中に残したいときには、これはできません。言い換えれば、Pythonの観点からは、最初の行から2行目への 'obj.a'アクセスの違いはありません。したがって、コピー操作を隠すことができる魔法のシグナルはありません。 – mgilson
[Pythonでリストを複製またはコピーするにはどうすればいいですか?](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – deceze
'obj.a'プロパティをオーバーライドして常にリストのコピーを返します。しかし、それはかなり高価で、コピーしない*の*正常な動作を期待する多くの仮定を破ります。コピー、期間が必要なときに明示します。 – deceze