2011-11-03 16 views
1

整数からなるリストを比較しようとすると、Pythonで奇妙なことがわかりました。例えばpythonでid()を使ったリスト(整数)を比較する

In [35]: id(range(1,5)),id(range(1,15)),id(range(16,0,-1)) 
Out[35]: (155687404, 155687404, 155687404) 

Q1: なぜ彼らのID()の値は同じですか?そして彼らは異なって見えるので、彼らはどのように同じになることができますか?

Q2: どのようにして整数のリストをid()値で比較できますか?

Q3: さらに好奇心をそそるために、id()値はどのように計算されますか? Pythonのドキュメントから直接

+4

? –

+1

@FrédéricHamidi私はちょうどそう思い出した。そして、hash()とid()は異なっています。思い出してくれてありがとう。 – xiaohan2012

+0

2つの範囲が同じであっても、同じidを持つと思う理由はありません。例えば、x = range(5); y = range(5); id(x)== id (y) 'を返すと、' False'を返します。また、Python 2では 'range'はリストを返します。リストはハッシュできません。平等をテストするだけで何が問題になりますか? – James

答えて

7

Return the “identity” of an object. This is an integer (or long integer) 
which is guaranteed to be unique and constant for this object during its lifetime. 
Two objects with non-overlapping lifetimes may have the same id() value. 

あなたはtheeseオブジェクトを比較するためにMD5ハッシュを得ることができます:

import md5 
>>> md5.new(str(range(1,5))).hexdigest() 
'd5397571a7f9c05bd58bed77f9dbe8f0' 
>>> md5.new(str(range(1,15))).hexdigest() 
'000b3ca7f2653a13cdb5b96f21c2ba4d' 
+1

私はこれが上にあると思います。 range(1,5); b = range(1,15))にオブジェクト(range)呼び出しをバインドすると、id(a)とid(b)はまだ生きているので異なるIDを返します。 –

+1

オブジェクトの文字列表現のmd5ハッシュは、一般的に非常に有用であるとは思われません... –

5

だけのid()を呼び出した後、あなたの範囲はスコープの外に出るためです - それらのIDは再利用されます。

まだアクセスできない場合は、IDが異なります。これを試してみてください:

>>> (a,b,c)=(range(1,5),range(1,15),range(16,0,-1)) 
>>> (id(a),id(b),id(c)) 
(3078445292L, 3078088588L, 3078090188L) 
6

idは、何とかオブジェクトのメモリ位置に対応しています。作成されたオブジェクトは使用されないので、自動的に削除されます。次のものを作成するときは、同じアドレスを使用するだけです。あなたは同じIDを持っていますが、それらは異なるオブジェクトです。

試してください:あなたは `のid()`ハッシュを計算することを考えさせる何

>>> x,y,z = range(1,5),range(1,15),range(16,0,-1) 
>>> id(x),id(y),id(z) 
(36015480, 36015760, 36005368)