Python 中的对象标识:为什么多个未命名对象共享相同的 ID
在 Python 中创建给定类的多个对象时,可能会出现以下情况:期望每个实例都拥有唯一的身份(ID)。然而,在某些情况下,连续创建未命名对象可能会导致它们具有相同的 ID。
了解对象生命周期和 ID
对象的 ID 代表其内存中的唯一位置。但是,此 ID 仅保证在对象的生命周期内唯一,而不是在整个程序执行过程中唯一。
在提供的示例中,您将使用 print 创建 someClass 类的两个未命名实例:
print(someClass()) print(someClass())
一旦 print 返回,创建的对象就不再被任何变量引用,并且有资格进行垃圾回收。在 Python 的 CPython 实现中,它们会立即有效地释放。
CPython 实现详细信息
Python 的垃圾收集通过引用计数进行。此外,对象的 ID 与其内存位置相关。当第一个未命名对象被释放时,它占用的内存位置就变得可用。
因此,创建的下一个对象将被放置在同一内存位置,从而导致为两个对象分配相同的 ID。
解决方案
要确保对象的 ID 不同,请考虑将对它们的引用保留在列表中或实现提供适当保证的类特定 ID,例如:
class SomeClass: next_id = 0 def __init__(self): self.id = SomeClass.nextid SomeClass.nextid += 1
通过实现自己的 ID 生成器,您可以为每个对象创建唯一的 ID,无论其生命周期如何。
以上是为什么多个未命名的 Python 对象有时共享相同的 ID?的详细内容。更多信息请关注PHP中文网其他相关文章!