比较在python中使用id()的列表(整数)

时间:2011-11-03 08:43:58

标签: python list hash compare

当我尝试比较由整数组成的列表时,我在Python中发现了一个奇怪的东西。

例如:

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: 为了更好奇,如何在Python中计算id()值?

3 个答案:

答案 0 :(得分:7)

直接来自python的doc:

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.

您可以获取md5哈希来比较theese对象:

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

答案 1 :(得分:6)

id以某种方式对应于对象的内存位置。您不使用创建的对象,因此它们会被自动删除。当您创建下一个时,它只使用相同的地址。所以你有相同的id,但它们是不同的对象。

尝试:

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

答案 2 :(得分:5)

这是因为在调用id()之后,你的范围超出范围 - 然后重复使用它们的ID。

如果他们仍然可以访问,那么他们的身份将会有所不同。试试这个:

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