xia*_*012 1 python hash compare list
当我尝试比较由整数组成的列表时,我在Python中发现了一个奇怪的东西.
例如:
In [35]: id(range(1,5)),id(range(1,15)),id(range(16,0,-1))
Out[35]: (155687404, 155687404, 155687404)
Run Code Online (Sandbox Code Playgroud)
Q1: 为什么他们的id()值是一样的?它们看起来有什么不同,它们怎么能一样?
Q2: 如何通过id()值比较整数列表?
Q3: 为了更好奇,如何在Python中计算id()值?
直接来自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.
Run Code Online (Sandbox Code Playgroud)
您可以获取md5哈希来比较theese对象:
import md5
>>> md5.new(str(range(1,5))).hexdigest()
'd5397571a7f9c05bd58bed77f9dbe8f0'
>>> md5.new(str(range(1,15))).hexdigest()
'000b3ca7f2653a13cdb5b96f21c2ba4d'
Run Code Online (Sandbox Code Playgroud)
id以某种方式对应于对象的内存位置.您不使用创建的对象,因此会自动删除它们.当您创建下一个时,它只使用相同的地址.所以你有相同的id,但它们是不同的对象.
尝试:
>>> x,y,z = range(1,5),range(1,15),range(16,0,-1)
>>> id(x),id(y),id(z)
(36015480, 36015760, 36005368)
Run Code Online (Sandbox Code Playgroud)
这是因为在调用id()之后,你的范围超出范围 - 然后重用它们的id.
如果他们仍然可以访问,那么他们的身份将是不同的.试试这个:
>>> (a,b,c)=(range(1,5),range(1,15),range(16,0,-1))
>>> (id(a),id(b),id(c))
(3078445292L, 3078088588L, 3078090188L)
Run Code Online (Sandbox Code Playgroud)