如果已经有hash(),为什么在Python中需要id()

Nis*_*sba 1 python hash objectid

id()函数的Python文档说

id(object)返回对象的"标识".这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠生存期的两个对象可以具有相同的id()值.

因此,实际上,它保证了作为哈希函数的唯一性,但仅在对象生命周期内,并且没有哈希难以重构的酷事.

为什么要使用id()

use*_*ica 5

hash对于相等的对象是相等的,即使对于不相等的对象也可能是相等的.hash对于可变对象甚至不存在.

id 保证对象在其生命周期内是唯一的,并且它不关心变异.

用例完全不同.

>>> x, y, z = 1, 1.0, [1]
>>> hash(x), hash(y)
(1, 1)
>>> hash(z)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> id(x), id(y)
(10832608, 139668416746072)
>>> id(z)
139668282136008
>>> z.append(2)
>>> id(z)
139668282136008
>>> hash(-1), hash(-2)
(-2, -2)
Run Code Online (Sandbox Code Playgroud)

  • @Nisba,是的,这是一个实现细节/优化,是的,因为`1`是自动实现的,因此它只有一个实例. (2认同)
  • @Nisba是的,这就是我在我的例子中专门使用`x [0] + x [1]`的原因.CPython可以优化文字,而不是对象引用.此外,即使对于较长的字符串,传递给`id`的文字也是匿名的,并且在调用`id`完成后可以回收临时对象,允许对象id重用于第二个. (2认同)