【问题标题】:Same object issue in Python [duplicate]Python中的相同对象问题[重复]
【发布时间】:2016-03-18 06:13:48
【问题描述】:

我观察到您将获得与下面的示例代码相同的对象(在相同的地址)。我期待每次函数运行时,我都会得到一个不同的函数。我在网上搜索,但没有找到解释。

任何关于为什么会发生这种情况的说明/任何关于我如何每次都能获得不同对象的建议将不胜感激。

谢谢!

>>> class A:
...   pass
>>>
>>> def test():
...   print A()
... 
>>> test()
<__main__.A instance at 0x10d2ac320>
>>> test()
<__main__.A instance at 0x10d2ac320>

【问题讨论】:

标签: python python-2.7 oop object


【解决方案1】:

正在每次都得到一个不同的对象。

发生的情况是第一个不同的对象是活动的,被打印出来,然后被垃圾收集器回收。然后创建一个新对象,它恰好获得与最后一个对象相同的内存位置(因此具有相同的 ID)。这实际上比您想象的要普遍得多(由于 CPython 内存分配器的实现)和 Stackoverflow 问题中不时出现的variants of this pop up

请注意,python 仅保证两个对象的 ID 永远不会相同,如果它们具有重叠的生命周期。来自docsid

返回对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。 生命周期不重叠的两个对象可能具有相同的 id() 值。

要查看您可以获得不同的对象,只需保留对返回的对象的引用。这将阻止垃圾收集器回收对象:

a = test()
b = test()
a is b

【讨论】:

  • 感谢您的回答!很有道理。