在Python中使用id()比较整数列表
我在用Python比较由整数组成的列表时,发现了一件奇怪的事情。
比如:
In [35]: id(range(1,5)),id(range(1,15)),id(range(16,0,-1))
Out[35]: (155687404, 155687404, 155687404)
问题1:为什么它们的id()值是一样的?它们看起来不一样,怎么会是同一个值呢?
问题2:我怎么能通过id()值来比较整数列表呢?
问题3:更深入一点,Python是怎么计算id()值的呢?
3 个回答
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是一样的,但它们其实是不同的对象。
试试:
>>> x,y,z = range(1,5),range(1,15),range(16,0,-1)
>>> id(x),id(y),id(z)
(36015480, 36015760, 36005368)
7
直接来自Python的文档:
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哈希值来比较这些对象:
import md5
>>> md5.new(str(range(1,5))).hexdigest()
'd5397571a7f9c05bd58bed77f9dbe8f0'
>>> md5.new(str(range(1,15))).hexdigest()
'000b3ca7f2653a13cdb5b96f21c2ba4d'