2016-07-04 14 views
35

2つの変数を持っているid同じ:Senderle this linkに応じ2つの変数は、同じIDを持っていますが、ないPythonでリストやタプル

a = [1, 2, 3] 
b = [1, 2, 3] 
a is b 
>>> False 

:私は2 list秒を取る場合

a = 10 
b = 10 
a is b 
>>> True 

不変のオブジェクト参照が同じIDを持ち、リストのように異なるIDを持つような可変オブジェクトがあると答えました。タプルは変更可能ではないよう

a = (1, 2, 3) 
b = (1, 2, 3) 
a is b 
>>> False 

理想的には、それはTrueを返す必要がありますが、それはFalseを返している:意味 -

は、だから今彼の答えによると、タプルは、同じIDを持っている必要があります!

説明は何ですか?

+0

あなたは、変数やオブジェクト(リストやタプル)を区別する必要があります。 – dmitryro

+13

あなたはあなたがリンクしている答えを誤解していると思います。固有の不変オブジェクトは異なるIDを持ちます。しかし整数が<256(ほとんどのインタプリタで)の場合、値はメモリにあらかじめロードされているので、最初の例ではaはbです –

+0

ありがとう@JacquesGaudin!今私のためにいくつかの理解をしています。 –

答えて

44

不変オブジェクトには同じidがありません。実際には、別途定義したオブジェクトの種類には当てはまりません。 Pythonでオブジェクトを定義するたびに、新しいアイデンティティーを持つ新しいオブジェクトを作成します。

しかし、小さな整数(-5から256まで)と小さな文字列(特殊文字の長さ(通常は20文字未満))はシングルトンであり、同じid(実際には複数のポインタ)。あなたは次のようにこの事実を確認することができます。

>>> 30 is 20 + 10 
True 
>>> 
>>> 300 is 200 + 100 
False 
>>> 'aa' * 2 is 'a' * 4 
True 
>>> 'aa' * 20 is 'a' * 40 
False 

とカスタムオブジェクトの

>>> class A: 
... pass 
... 
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity 
False 

isオペレータは、オブジェクトのアイデンティティではなく、値をチェックすることに注意してください。

>>> 300 == 3*100 
True 

タプル(他のタイプ)には、このようなルールが存在しないので、あなたが任意のサイズで2つの同じタプルを定義した場合、彼らは自分のIDを取得します:あなたが値をチェックしたい場合は、==を使用する必要があります。

>>> a = (1,) 
>>> b = (1,) 
>>> 
>>> a is b 
False 

そしてシングルトン整数の事実と文字列をインターンはあなたが可変と不変オブジェクト内でそれらを定義する場合にも真であることに注意してください。

>>> a = (100, 700, 400) 
>>> 
>>> b = (100, 700, 400) 
>>> 
>>> a[0] is b[0] 
True 
>>> a[1] is b[1] 
False 
+0

:a [1]はb [1]がTrueである必要があります。なぜFalseを返すのですか? –

+4

@RamなぜそれがTrueを返すべきだと思うのですか?2つの別々のオブジェクト(整数)ですが、同じ値(IDではない)です。そして、それらが256以上であることに注意してください。 – Kasramvd

+1

はい、同意します。私は整数<256だけids()trueを返すと思う。 Pythonインタプリタで256より大きい整数は、それ自身のid空間を持ちます。値は同じになります。 –

19

不変!=同じオブジェクト。*

An immutable object is simply an object whose state cannot be altered;などです。 新しいオブジェクトが作成されると、新しいアドレスがに割り当てられます。したがって、アドレスがisと等しいかどうかを確認すると、Falseが返されます。

1 is 1または"a" is "a"戻っTrueがそう、それはあなたを混乱させてはいけないのPythonによって行わinteger cachingと文字列interningによるものであるという事実は、問題のオブジェクトが変更可能/不変であることとは関係ありません。


*空不変オブジェクトdo refer to the same objectとそのisネスは、しかし、これは特殊な実装特定のケースで、trueを返しありません。

15

このコードを見てみましょう:

>>> a = (1, 2, 3) 
>>> b = (1, 2, 3) 
>>> c = a 
>>> id(a) 
178153080L 
>>> id(b) 
178098040L 
>>> id(c) 
178153080L 

a is cTruea is bに対し、利回り私は強くあなたがスニペットで、上記のステップ・バイ・ステップを実行することをお勧めしますFalseとして評価される理由を把握するためには、 Online Python Tutor。メモリ内のオブジェクトの図形表示は、この問題の深い洞察を提供します(私はスクリーンショットを添付しています)。同じリストやタプルの要素を持つにもかかわらず、あなたは、このように2つのオブジェクトを比較するときに、異なるそれぞれのメモリアドレスを比較 -

enter image description here

関連する問題