2016-08-24 2 views
3

hereと書かれています。Pythonには、アトミックオブジェクト型と参照オブジェクト型の両方があります。原子オブジェクトはint、long、complexです。 アトミックオブジェクトを割り当てるときは、参照オブジェクトの参照を代入するときにその値がコピーされます。pythonアトミックデータ型

私の質問は次のとおりです: なぜ、私はコードが "真"になるのですか?

a = 1234 
b = a 
print id(a) == id(b) 

私は値をコピーしていないようですが、私はちょうどそれがどんなタイプであっても参照をコピーします。

+7

そのページは間違っています。 – vaultah

+5

Pythonの簡単な代入( 'name = something')は決してコピーを作成しません。[Ned Batchelder](http://stackoverflow.com/users/14343/ned-batchelder)の[Pythonの名前と値についての事実と誤解](http://nedbatchelder.com/text/names.html)を参照してください。 –

+1

Pythonには参照のみがあります。もっと興味深いのは、それらが可変または不変のオブジェクトを参照しているかどうかです。 – spectras

答えて

4

Pythonでの割り当て(バインディング)は、データをコピーしません。常にバインドされている値への参照をコピーします。

インタープリタは右側の値を計算し、左側はそれを参照して新しい値にバインドされます。右側の式が既存の値であれば(言い換えれば、演算子がその値を計算する必要がない場合)、左側は同じオブジェクトへの参照になります。

a = b 

が実行され、

a is b 

は常にtrueになります - それは、割り当てがPythonでどのように動作するかです。コンテナにも当てはまるので、x[i].some_attribute = yx[i].some_attribute is yをtrueにします。

Pythonが原子型と参照型を持っているという主張は、あまり真実ではないなら、私には役に立たないようです。私はそれが原子型とコンテナ型を持っていると思います。コンテナは、リスト、タプル、辞書、およびプライベート属性を持つインスタンス(最初の近似値)のようなものです。

+0

あなたの答えをありがとう! –

0

int型は不変です。 番号1234の参照は変更されません。リストのような変更可能なオブジェクトのための

、あなたが実際に@spectrasよう

import copy 
a = copy.deepcopy(b) 
0

を使用することができ辞書は唯一の参照があるが、float秒、int秒、tupleのような不変オブジェクトがあると述べました。不変オブジェクト(メモリ消費量を除く)では、参照を渡すかコピーを作成するだけで問題ありません。

a=1 
b=1 
c=2/2 
d=12345 
e=12345*1 

a is b用などがtrueで、a is cも事実であるが、d is eがfalseであるため、インタプリタでも同じ値が面白いのアイデンティティのための番号を確認し、交換可能意思であることで数字を利用して、いくつかの最適化を行います(==

変更不可能なオブジェクトは、 変更すると、実際にオブジェクト自体を変更するのではなくスレッドセーフです。新しい参照を変数に入れます(これはスレッドセーフです)。