2017-01-16 9 views
-4

以下の例では、ID(X)= ID(y)をしながら、なぜID(A)== ID(b)は次のとおりです!パイソンからpython:xとyが等しい値のリストである場合、なぜid(x)!= id(y)ですか?

>>> a = 9 
>>> b = 9 
>>> id(a) 
10901176 
>>> id (b) 
10901176 
>>> id(a) == id(b) 
True 
>>> x = [1, 2, 3] 
>>> y = [1, 2, 3] 
>>> id(x) != id(y) 
True 
>>> id(x) 
11428848 
>>> id(y) 
12943768 

私は(IDの取得3.6 DOC)「に戻ります生存期間が重複していない2つのオブジェクトのid()値が同じである可能性があります。 "...しかし、それはdoesnそれを私に説明しないでください。何か案は?

+3

「一意であることが保証されています」これでクリアされませんか? – Moira

+1

2つの別々のリストが作成されているためです。それらには同じアイテムが含まれています(同じです)が、同じオブジェクトではありません(同一ではありません)。 – jonrsharpe

+0

は、メモリ位置「a = 9; b = 5; b + = 4; print_id(a)、id(b) ' –

答えて

4

ab整数が同じidがちょうど不変オブジェクト上のpythonで行わストレージ最適化されていたという事実(例、依拠することはできません。数字は十分な大きされている場合、id sが異なる場合があります)

bの値を変更しようとすると、id(b)の変更が表示されます。

もちろんリストとは異なります。変更可能なのでストレージの最適化の恩恵を受けることはできません:yを変更したときにxを変更しないようにします。

+2

これは*すべての*不変オブジェクトには適用されません。 CPythonは-5〜257の間で 'int'オブジェクトをあらかじめ割り当てます(多かれ少なかれ)。この範囲外の 'int'、または他の不変オブジェクトは、同じオブジェクトを再利用することは保証されません。 – chepner

+0

@chepner:はい、私はすでに私の答えでそれを述べています。等価性をチェックするためにidを比較する(または 'is 'を使う)ことは信頼できません。 –

+0

ありがとうございます – tealowpillow

関連する問題