2つの変数がPythonで同じオブジェクトを参照しているかどうかを比較する


回答:


133

それは何is:用でx is y戻っTrueた場合xy同じオブジェクトです。


6
この例でx is zは、を返しますFalse。ただし、xとzにリストではなく同じ値が割り当てられている場合(たとえばx, z = 13, 13)はをx is z返しますTrue。何故ですか?
Bill

12
@ビル:それはPythonがintを処理する方法のアーティファクトです。Pythonは整数オブジェクトを割り当てx、それにzポイントします。小さな整数は一般的に失敗するため(エラー値として-1、実際に何かにインデックスを付けるときは常に0、小さな数字は通常妥当なデフォルト値です)Pythonは小さな数字(-5〜256)を事前に割り当てることによって最適化し、同じ整数オブジェクトを再利用します。したがって、あなたの例はこの範囲の数値に対してのみ機能します。より大きなもの、つまりを割り当ててみてください270。詳細ルックのため、ここで
テッド

1
@AndresRいいえ、それは間違いです。is2つの名前が同じメモリ位置を参照しているかどうかを確認します。オブジェクト自体とは関係ありません。等しいが同じ場所に格納されていない、たとえば''a'*10000 is 'a' * 10000False である文字列のような変更不可能なオブジェクトを持つのは簡単です。
Jochen Ritzel 2017

1
@JochenRitzelあなたは完全に正しいです、このコメントをありがとう!それで、私は何が起こっているの"af" is "af"() is ()わかりませんか...なぜ彼らは同じメモリ位置を共有するのですか?
AndresR

2
@AndreasRコード内のリテラル文字列/数値の場合、コンパイラーはそれらが1回だけ存在することを確認して再利用します。()、None、True、Falseなどの特別な値もシングルトンとして定義されています。実行中、ランタイムは小さな数値と文字列の再利用も試みますが、結局のところ、速度とメモリの間のトレードオフとなり、何が発生するかは、Pythonランタイムの実装方法によって異なります。
Jochen Ritzel


11

2つの正解ながらx is zid(x) == id(z)、既に掲載されている、私は、Pythonの実装の詳細を指摘したいと思います。Pythonは整数をオブジェクトとして保存します。最適化として、開始時に一連の小さな整数(-5〜256)を生成し、小さな値を持つ整数を保持するすべての変数がこれらの事前初期化オブジェクトを指すようにします。より詳しい情報

2つのオブジェクトが同じ(trueを返すであろうする場合、整数をチェック同じ少数(-5〜256)に初期化オブジェクトことをこれは意味上のC-Pyhon限り、私はこれは承知のように、実装の詳細大きいためながら、)数値は、一方のオブジェクトが他方から初期化されている場合にのみtrueを返します。

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True

python3.6:a = 98765; b = 98765; aはb => Trueです。明らかに何かが変わった。
ミハイルカラシニコフ

@MikhailKalashnikovいいえ 私はPython 3.6.2でテストしましたが、これはまだ存在しています。
nix 2017

Python 3.7.7にはまだ存在します
Bill Huang

9

id()を使用して、各変数名が参照する一意のオブジェクトを確認することもできます。

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)

IDの使用に関する@tedのメモは、ここで非常に重要です。
Leo Ufimtsev


2

これはdocs.python.orgによるものです:「すべてのオブジェクトにはID、タイプ、値があります。オブジェクトのIDは、一度作成されると変更されることはありません。メモリ内のオブジェクトのアドレスと考えることができます。'is '演算子2つのオブジェクトのIDを比較します; id()関数はそのIDを表す整数を返します。

どうやら値を変更するたびに、IDの変更によって示されるようにオブジェクトが再作成されます。行x = 3の後に行x = 3.14が続くと、エラーは発生せず、xのID、タイプ、および値が異なります。


1
優れたドキュメントキャッチ。
prosti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.