我正在使用Python(3.3.3)做一些事情,我遇到了一个让我困惑的问题,因为据我所知,每次调用类时,它们都会获得一个新的ID。
假设你在某个.py文件中有以下内容:
class someClass: pass
print(someClass())
print(someClass())
上面返回相同的id,这让我感到困惑,因为我在调用它,所以它不应该是相同的,对吗?当连续两次调用相同的类时,Python是如何工作的呢?如果我等几秒钟它会给出不同的id,但如果像上面的例子一样立即调用它似乎不起作用,这让我感到困惑。
>>> print(someClass());print(someClass())
<__main__.someClass object at 0x0000000002D96F98>
<__main__.someClass object at 0x0000000002D96F98>
它返回相同的结果,但为什么?例如,我也注意到了范围。
for i in range(10):
print(someClass())
当快速调用类时,Python为什么会这样做?我甚至不知道Python会这样做,或者这可能是一个bug吗?如果不是bug,有人能解释一下如何修复它或一种方法,使得每次调用方法/类时都生成不同的id吗?我很困惑它是如何实现的,因为如果我等待一段时间,它确实会改变,但如果我尝试调用相同的类两次或更多次,它就不会改变。
free
然后再次被malloc
(或等价物)分配,而实际上它甚至没有超出Python的PyObject空闲列表,这就是为什么它会如此一致地发生(考虑到您详细解释的注意事项),即使在不同平台或使用调试 malloc 等情况下也是如此。 - abarnertobject
tp_dealloc
调用堆类型的tp_free
,它是PyObject_GC_Del
。这又使用了宏PyObject_FREE
。关于 CPython 的编译方式,需要注意的是,如果没有启用 pymalloc,则宏PyObject_FREE
被定义为PyMem_FREE
,对于非调试版本只是free
。因此,在这一点上,地址重用取决于平台的malloc
。 - Eryk Sun