2016-09-02 17 views
1

私はリストである属性を持つオブジェクトを持っています。たとえば: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あなた、 トーマス

+3

コピー時にリストを明示的にコピーしないと、コピーで作業していないときに操作中に残したいときには、これはできません。言い換えれば、Pythonの観点からは、最初の行から2行目への 'obj.a'アクセスの違いはありません。したがって、コピー操作を隠すことができる魔法のシグナルはありません。 – mgilson

+0

[Pythonでリストを複製またはコピーするにはどうすればいいですか?](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – deceze

+1

'obj.a'プロパティをオーバーライドして常にリストのコピーを返します。しかし、それはかなり高価で、コピーしない*の*正常な動作を期待する多くの仮定を破ります。コピー、期間が必要なときに明示します。 – deceze

答えて

1

それが割り当てl = obj.aobj.aのコピーを作成することが可能ではありません。 decezeがコメントで述べたように、aにアクセスするたびに値のコピーを返すプロパティを作成できますが、それはlに割り当てるときだけでなく、アクセスするたびにコピーを作成することになります。つまり、このようなものとの違いを教えてobjまたはobj.aための方法はありませんとにかく

をしたい動作を非効率的になるだろう、おそらくいない:

x = obj.a 

と、この:

obj.a[:2] 

obj.aにアクセスするとどうなるかは、どちらの場合でも起こります。変数を変数に代入するかどうかを調べることはできません。その特定のケースで変数をコピーするだけです。

+0

ありがとうございました。私が望む振る舞いは、いくつかの言語でバリュークラスと呼ばれるものに近いと思います! –

0

だけで、これはあなたが実際に別のリストにリストのクローンを作成することなく、これが不可能な新しいリストに

0

をリストをコピーすることができます

l = list(obj.a) 

...次のコードを使用し、あなたが持っています必要に応じてcopy()またはdeepcopy()を使用します。