記事のディレクトリ
何の言及共有されています
私たちはPythonの対話モードで次の文を入力したとします
>>> a = 3
>>> b = a
- 1
- 2
正味の効果は、変数aとbは、(同一のメモリ空間を指している)は、同じオブジェクトを参照することです。これは、Pythonで共有参照と呼ばれている - 多くの変数名が同じオブジェクトを参照してください。
ステートメントがあるとすれば
>>> a = 'spam'
- 1
何が起こりますか?
変数の作成定数式「スパム」で新しいオブジェクトへの参照が、変数はまだ3 bは、元のオブジェクトを参照、これは代入演算子3を変更するためのオブジェクトではないので、それが唯一の変数にポイントしていない変数bを変更します変更。
Pythonでは、変数ではなく、メモリ領域の(例えばC言語の変数のような)ラベルを変更することができ、常にオブジェクトへのポインタです。元のオブジェクトを変更するが、完全に別のオブジェクトを参照するために、この変数をさせて、新しい値に変数を割り当てます。
注:シーンに変数オブジェクトとその場所を変更する場合は、上記の事情の変化のいくつかの種類があるでしょう。
その場での参照と変更(参照の共有とインプレース変更を)共有
所定の位置にオブジェクトを変更ず、オブジェクトと操作いくつかあります。例えば、オフセット割り当てリストには、代わりに、オブジェクトの新しいリストを生成するオブジェクトのリストを変更しません。一つの変数への変更が他の変数に影響を与えますので、代わりにこの変更のオブジェクトのサポートは、共有の参照は、注意しなければなりません。
次の文を考えてみましょう。
>>> L1 = [2, 3, 4]
>>> L2 = L1
- 1
- 2
L1は、2,3,4を含むオブジェクトのリストです。リストの要素はそう、彼らの位置によって読み取られるL1[0]
参照もちろん2.オブジェクト、リスト自体はちょうど、整数や文字列など、オブジェクトです。上記操作後、二行、L1、およびL2が同じオブジェクトを参照します。
プラス3行目になりました。
>>> L1 = [2, 3, 4]
>>> L2 = L1
>>> L1[0] = 24
- 1
- 2
- 3
私たちは、L1とL2の値を見てみましょう。
>>> L1
[24, 3 ,4]
>>> L2
[24, 3 ,4]
- 1
- 2
- 3
- 4
ここで、L1を変化させない、変更素子L1参照されるオブジェクトは、このような修飾は、リストオブジェクトの部分をカバーします。修正のみL1に影響を与えないように同時に、L1およびL2参照オブジェクトの一覧には、L2も同じ場所に影響しますので。私たちは、L2を変更しませんが、その値は変化しますが。
あなたは、このような結果をしたくない場合は、参照を作成するのではなく、オブジェクトをコピーする必要があります。リストをコピーするには多くの方法がありますが、最も簡単な方法は、最初から最後までスライスにあります。
>>> L1 = [2, 3, 4]
>>> L2 = L1[:]
>>> L1[0] = 24
>>> L1
[24, 3, 4]
>>> L2
[2, 3, 4]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
参照がL1参照されたオブジェクトのコピーであるとしてここでは、修正はL2、L1、L2には影響しません。異なるメモリ領域に、すなわち、L1、及びL2点。
共有参照と等しいです
>>> x = 42
>>> x = 'shrubbery'
- 1
- 2
Pythonはこれらの2行を実行した後にキャッシュし、小さな整数と小さな文字列を再利用するので、オブジェクト42を回復することはないかもしれません。むしろ、それはまだ次回のためにあなたを待って、システムテーブルに格納することができます別のコードの再利用を生成する42。それが参照されていないときにそれにもかかわらず、ほとんどのタイプのオブジェクトはすぐに回収されます。
2つの変数が等しいかどうかを確認するためのPythonの2つの異なる方法があります。
>>> L = [1, 2, 3]
>>> M = L # M and L reference the same object
>>> L == M # Same values
True
>>> L is M # Same objects
True
- 1
- 2
- 3
- 4
- 5
- 6
==
試験2を参照されたオブジェクトが同じ値を有するかどうかをオペレータは、この方法は、多くの場合、Pythonで等しい確認するために使用されます。
is
オペレータの検査対象物のためのオペレータにアイデンティティ。両方の変数名が同じオブジェクトを指している場合、これは平等のためのより厳格なテストがあるので、それは、Trueを返します。
実際には、is
比較的ポインタで参照し、これは共有参照を検出する方法です。異なるオブジェクトを参照する変数名ならば、二つのオブジェクトの値が等しい場合でも、またFalseを返します。
例えば:
>>> L = [1, 2, 3]
>>> M = [1, 2, 3] # M and L reference different objects
>>> L == M # Same values
True
>>> L is M # Different objects
False
- 1
- 2
- 3
- 4
- 5
- 6
同様の試験の数が少ない場合:
>>> X = 42
>>> Y = 42 # Should be two different objects
>>> X == Y
True
>>> X is Y # Same object anyhow: caching at work!
True
- 1
- 2
- 3
- 4
- 5
- 6
べきであり、しかし、ばかげた、X 42及びY参考に6行5は、もともと二つのオブジェクト42を引用し、論理的に3〜4行、言えば、2つのオブジェクトが同じを持っているので、理解しますキャッシュされ、再使用されている小さな整数や文字列のため、False出力魚は、しかし、そうis
私たちXとYが同じオブジェクトを参照してください教えてください。
実際には、あなたが使用することができsys
、モジュールのgetrefcount
機能クエリオブジェクトの引用を。例えば、我々は整数で引用回数をチェックしてください。
>>> import sys
>>> sys.getrefcount(1)
812
- 1
- 2
- 3
このオブジェクトキャッシュ機構と、コードの再利用は関係ありません。Pythonのこれは、実行のスピードを上げるために行われます。