我在python中做了一些事情(使用python 3.3.3),並且我遇到了一些令我困惑的事情,因爲我的理解類每次調用時都會獲得一個新的id。爲什麼Python類的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'd,然後是'malloc'd(或者一些等價的),當它甚至沒有超出Python的PyObject自由列表時,並且_that's_爲什麼它發生得如此一致(取決於你的解釋注意事項),甚至跨平臺或調試malloc等等。 – abarnert
基礎對象''tp_dealloc'調用['PyObject_GC_Del'] [堆類型的'tp_free'](http://hg.python.org/cpython/file/c3896275c0f6/Objects/typeobject.c#l2370) (http://hg.python.org/cpython/file/c3896275c0f6/Modules/gcmodule.c#l1621)。這反過來使用宏'PyObject_FREE'。關於如何編譯CPython的警告是[沒有pymalloc](http://hg.python.org/cpython/file/c3896275c0f6/Include/objimpl.h#l133)宏PyObject_FREE被定義爲PyMem_FREE ',這對於非調試版本來說是「免費」的。所以在這一點上,地址重用取決於平臺'malloc'。 – eryksun
說到提及垃圾收集:)。 – ivanleoncz