2016-03-27 8 views
0

PythonはPerlなどとは異なり、参照を扱えないことは知っていますが、同じメモリアドレスを参照するため、値がリンクされている単純な変数を作成することは可能ですか?私はリストと辞書の浅いコピーが同じアドレスを参照する値を含んでいることを知っています。Pythonで同じ値を指す2つの変数

>>> foo = 1 
>>> bar = foo 
>>> bar = 0 
>>> foo 
1 
>>> foo = [1,2] 
>>> bar = foo 
>>> bar[1] = 0 
>>> foo 
[0,2] 

Cf. Perlの

$ref = 1 
$foo = \$ref 
$bar = $foo 
print $$bar //gives 1 
$$foo = 0 
print $$bar //gives 0 

私はそれはPythonでハッキング/行うことができるかに興味がありますということである理由で。 具体的な例を挙げると、私はクラスに2つの "同義語"属性を与えたかったでしょう。 は、私は1つが第2の値マスキングすることによって(間違った場合はテストされていない、申し訳ありません)このようshenaniganをやってのけることができることとします

class fake: 
    def __init__(self,template): 
     self.ref = template # keep alive 
     self.__dict___ = template.__dict__ 
     self.__class___ = template.__class__ 
    def __getitem__(self): 
     return self.ref.__getitem__ 
    def __setitem__(self,value): 
     self.ref.__setitem__(value) 

をしかし、それは非常に私は好奇心だったものの精神ではありませんが、もしハックは唯一の方法です、私はそれを行って、最善の方法を知りたいです。

+0

の確認here。たとえば、それを唯一の要素としてリストに入れることができます。 '[x]'とし、リストへの参照を使います。あるいは 'dict'に入れたり、' class'を作りました。 –

答えて

0

@property関数を作成して最初の値を返すのはなぜですか。

class C: 
    def __init__(self): 
     self.attr1 = 12345 

    @property 
    def synonym(self): 
     return self.attr1 

    @synonym.setter 
    def synonym(self, value): 
     self.attr1 = value 

これはsynonymへの参照がattr1に通過させることが聞かせ。

+0

なぜこの回答が下降したのですか?私は何かが間違っていると思っていますが、@propertyデコレータにはあまり慣れていません。 –

+0

私はこの解決策を使い終わった。おかげで –

1

immutableオブジェクトを変更することはできません。参照の再割り当てのみが可能です。メモリ内のここ

foo = bar = 1 
bar = 0 

あなたが破壊されることはありません1が、これはあなただけ0barポイントを再割り当て、およそ何不変です。

foo = bar = [1,2] 
bar[1] = 100 

参照オブジェクトをメモリ内で変更します。

>>> b = 1 
>>> id(b) 
15216984 
>>> b = 2 
>>> id(b) 
15216960 # reference points to another object 
>>> a = [1,2] 
>>> id(a) 
139917071841904 
>>> a[0] = 100 
>>> id(a) 
139917071841904 # object is the same, therefore all references pointed to it will show changes 
-1

ディープコピーで「ハックする」方法があります。

from copy import deepcopy 
foo = [1,2] 
bar = deepcopy(foo) 
bar[1] = 0 
print bar, foo 

あなたが参照することができ、いくつかのオブジェクトに値を格納しますPythonでは説明

+0

ここに深いコピーの必要はありません、彼らはまだ同じリストを参照します – Fredrik