我观察到您将获得与下面的示例代码相同的对象(在相同的地址)。我期望每次该函数运行时,我都会得到一个不同的函数。我在网上搜索但没有找到这方面的解释。
任何关于为什么会发生这种情况的澄清/任何关于我如何每次都能获得一个distinct对象的建议将不胜感激。
谢谢!
>>> class A:
... pass
>>>
>>> def test():
... print A()
...
>>> test()
<__main__.A instance at 0x10d2ac320>
>>> test()
<__main__.A instance at 0x10d2ac320>
你每次都会得到一个不同的对象。
发生的情况是,第一个不同的对象处于活动状态,被打印,然后被垃圾收集器回收。 然后创建一个新对象,并且它恰好获得与上一个对象相同的内存位置(因此具有相同的 ID)。 这实际上比您想象的要常见得多(由于 CPython 内存分配器的实现),并且 Stackoverflow 问题中时不时会出现此弹出窗口的变体。
请注意,Python 仅保证两个对象在生命周期重叠的情况下永远不会具有相同的 ID。 来自id
的 docs
:
返回对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。要看到您可以获得不同的对象,只需保留对返回的对象的引用即可。 这将防止垃圾收集器回收对象:生命周期不重叠的两个对象可能具有相同的 id() 值。
a = test()
b = test()
a is b