python - Python 中的相同对象问题

标签 python python-2.7 oop object

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

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

谢谢!

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

最佳答案

每次都获得一个不同的对象。

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

请注意,Python 仅保证两个对象在生命周期重叠的情况下永远不会具有相同的 ID。来自 docs对于id:

Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

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

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

关于python - Python 中的相同对象问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36077388/

相关文章:

python - 查找Docker镜像的依赖项

python - 如何在Python上过滤数据透视表

python-2.7 - 在类的一个函数中获取用户输入并在 Python 中的另一个函数中使用它

mysql - Cloud SQL 访问被拒绝

php - 复制/克隆对象的一部分?

python - TensorFlow 2.0 如何从 tf.keras.layers 层获取可训练变量,如 Conv2D 或 Dense

python - 在最小堆中获取前n个最大元素的时间复杂度是多少?

python - 属性错误 : 'int' object has no attribute 'copy'

java - 使用带有compareTo()的接口(interface)类型 - 错误(java)

java - 将子项转换为父项 - 由于缺少方法而导致编译时错误 - 为什么?