2017-01-17 11 views
2

Pythonは名前を使ってオブジェクトを参照します。 a = bと言うとき、abは同じオブジェクトを参照し、aを変更すると、同じ変更がbに表示されます。たとえば、Pythonはいつ新しいオブジェクトを作成する

a = [1, 2, 3] 
b = a 

a.append(4) 

print(b) 

は、[1, 2, 3, 4]となります。

ただし、一部の操作では新しいオブジェクトが作成されます。たとえば、

a = 1 
b = a 

a = a + 1 

print(b) 

は、1となります。明らかに、行a = a + 1は、何らかの形で値がa + 1の新しいオブジェクトを作成し、aという名前をバインドします。これはどのように作動しますか?この場合、新しいオブジェクトを作成するメカニズムは何ですか?

この質問は、this oneの複製ではありません。この場合、オブジェクトの作成方法を具体的に尋ねていますが、他の質問はオブジェクトがオブジェクトを共有するときに一般的でした。

+2

リストは可変です(それらをコピーするには 'コピー'またはスライスして '[:]'を使用します)、整数は不変です(文字列のように毎回再構築されます) –

+4

[代入演算子](http://stackoverflow.com/questions/34521078/how-does-python-assign-values-after-assignment-operator) –

+0

技術的には、私は 'a = a + 1' *が* Pythonは[-5、256]の範囲の整数をキャッシュするので、この特定のケースでは新しいオブジェクトです。むしろ、私は、キャッシュからあらかじめ作られた整数オブジェクトを 'a'に割り当てると思います。言い換えれば、 'a'は' b'とは異なるオブジェクトを指しますが、そのステートメントにはオブジェクトが作成されていません。私が間違っていれば、私を訂正してください。 – Tagc

答えて

0

Luciano Ramalhoの本のオブジェクト作成の仕組みについて、私が探していた情報が見つかりましたFluent Python

Ramalhoは、__init__は通常「コンストラクタ」と見なされますが、実際には__new__メソッドを呼び出すことによってオブジェクトが作成されると説明しています。これはクラスメソッドで、クラスのインスタンスを返します。このインスタンスは、最初の引数として__init__(通常は "self")に渡されます。したがって、__init__はコンストラクタではなく初期化子です。我々は__dict__の印刷物からわかるように、__init__続い__new__を呼び出しa = C()

class C(object): 
    def __new__(cls): 
     new_inst = object.__new__(cls) 
     print new_inst.__dict__ 
     new_inst.var_1 = 1 
     return new_inst 

    def __init__(self): 
     print self.__dict__ 
     self.var_2 = 2 

a = C()    # Prints: 
         # {} 
         # {'var_1': 1} 
print a.__dict__ # returns {'var_2': 2, 'var_1': 1} 

b = C.__new__(C) # Prints: 
         # {} 
print b.__dict__ # returns {'var_1': 1} 

b.__init__()  # Prints: 
         # {'var_2': 2, 'var_1': 1} 
print b.__dict__ # returns {'var_2': 2, 'var_1': 1} 

ライン:

これは、以下の例を用いて説明することができます。これはオブジェクトbに示すように、別々の呼び出しに分割することができます。

This questionも該当します。

+1

あなたはOPなので、それが正しいかどうかを判断するのはあなた次第ですが、自分の質問に本当に答えたとは思いません。なぜなら、 'a = b'がいくつかの場合(例えば、大きな整数)、他のもの(例えば、リスト)に新しいオブジェクトを生成する理由がまだ説明されている。例えば、カスタムクラスの "プリミティブ的な"振る舞いを再現するために、クラスのメタクラス「__new__」を微調整することは可能ですか? – jdehesa

+0

あなたはそうです、それはおそらく部分的な答えです。しかし、それは私が最も興味があったものでしたが、私がこの質問で言及した「物体創造の仕組み」を理解するのに役立ちます。 – PProteus

関連する問題