Python中是否有对象唯一标识符

one*_*elf 73 python

这与java.lang.Object.hashcode()方法类似.

我需要在一个集合中存储我无法控制的对象,并确保只有当两个对象实际上是同一个对象(不包含相同的值)时才会覆盖这些值.

ily*_* n. 109

id(x)
Run Code Online (Sandbox Code Playgroud)

会为你做的伎俩.但我很好奇,这组对象有什么不对(它按值组合对象)?

对于您的特定问题,我可能会保留一组id或包装器对象.包装器对象将包含一个引用,并按x==y<==> 进行比较x.ref is y.ref.

值得注意的是Python对象也有一个hash功能.将对象放入集合或字典中是必需的.它应该有时会碰撞不同的对象,虽然良好的实现hash尝试使其不太可能.

  • @Roy相反,[docs](https://docs.python.org/2/library/functions.html#id)说`id(x)`_is_"保证在此期间对于此对象是唯一且常量的它的生命周期"会导致具有不同id的相同值的不同对象(只要它们同时存在),这将使OP能够做他们想要的事情. (9认同)
  • 投反对票,因为 id(x) 不能确保每个对象的唯一性。OP 非常清楚他/她希望将包含相同值的不同对象视为*不同*。 (3认同)
  • @sparrowt我明白了.我同意你的意见.关键点在于"当两个具有相同值的对象共存时,ID是唯一的*".`id()`似乎为具有相同值的重复创建(和销毁)对象返回相同的ID,因此我的原始注释,但实际上这里没问题,因为OP声明ID在对象共存时必须是唯一的.删除我的投票. (2认同)

Vic*_*ler 31

这就是" is"的用途.

而不是测试" if a == b",哪个测试相同的值,

test" if a is b",它将测试相同的标识符.

  • 说Python的"is"就像Java的"==",Python的"=="就像Java的"equals()"一样准确吗? (19认同)
  • @MatrixFrog是的. (11认同)
  • 对于那些想知道@Tyler 问题答案的人来说,答案是肯定的。请参阅/sf/answers/9311711/ (2认同)