2012-12-23 19 views
2

我有一個名爲Door的類和一個名爲Window的類。這是一個名爲Furniture的班的子班。我的程序讀取excel文件,循環2次,第一次讀/寫關於門的所有內容,第二次關於窗口。簡化的,我有以下代碼:指向同一位置的python類實例

for gathering_inf in ('door', 'window'): 
    for row in file: 
     if gathering_inf == 'door' and currently reading door line: 
      furniture = Door(width, height, description) 
     if gatherig_inf == 'window' and currently reading window line: 
      furniture = Window(width, height, description) 

     # Now do something with the furniture object .. 

這種情況發生的怪異覺得,如果我爲例(如上圖所示),打印對象furniture,我得到他們的位置和,一些對象的內存位置是一樣的,儘管它們是兩個不同的實例寬度不同的屬性。例如:

<__main__.Door object at 0x03BFE810> 
<__main__.Door object at 0x03BFE890> 
<__main__.Door object at 0x03BFE810> 
<__main__.Door object at 0x03BFE890> 
<__main__.Door object at 0x03BFE8B0> 
<__main__.Door object at 0x03BFE8D0> 
<__main__.Door object at 0x03BFE8B0> 
<__main__.Window object at 0x03BFE8D0> 
<__main__.Window object at 0x03BFE8B0> 
<__main__.Window object at 0x03BFE890> 
<__main__.Window object at 0x03BFE8B0> 
<__main__.Window object at 0x03BFE890> 
<__main__.Window object at 0x03BFE8B0> 
<__main__.Window object at 0x03BFE890> 
<__main__.Window object at 0x03BFE8B0> 
<__main__.Window object at 0x03BFE890> 

有人可以向我解釋爲什麼python的行爲是這樣嗎?

+0

是你的第二個,如果子句中一個錯字,你檢查,對一個變量gather_ing? – opensourcegeek

+0

是的,這是一個錯字。我正在編輯我的帖子。 – geekkid

回答

4

這是因爲引用計數垃圾收集器。只要一個新對象被分配給furniture,GC就會刪除該對象,因此其內存位置可以被新對象重新使用。


下面是一個小演示,顯示此行爲。請注意,由於Python REPL的工作方式(它保留對_中最後一個結果的引用),地址將會交替出現。

>>> foo = object(); foo 
<object object at 0x7fd74cd390a0> 
>>> foo = object(); foo 
<object object at 0x7fd74cd390b0> 
>>> foo = object(); foo 
<object object at 0x7fd74cd390a0> 
>>> foo = object(); foo 
<object object at 0x7fd74cd390b0> 
>>> foo = object(); foo 
<object object at 0x7fd74cd390a0> 
+1

+1提供代碼來支持索賠! – NlightNFotis

+0

謝謝你們的答案。我擔心我的代碼中有一個錯誤:d。這是我不應該擔心的事,對吧? – geekkid

1

ThiefMaster幾乎釘它:它的方式,Python的虛擬機的作品。

你所觀察到的是CPython的 implemetaion的引用計數垃圾收集器的細節。 CPython你的情況是垃圾收集Door對象,然後創建一個新的對象Window,然後重新使用(現在垃圾收集)對象的位置,在那裏存儲Window對象。

事實上很普遍,看到CPython重複使用以前垃圾收集的對象的地址。 舉例來說,在我的電腦上運行ThiefMaster的代碼,我得到了稍微不同的(旋轉)結果:

CPython memory usage

在這一點上要注意,這種行爲是特定CPython是很重要的。例如,Enthought's Python Distribution似乎並沒有產生類似的結果,但是我不知道這種不一致實現差異的問題:

enter image description here

相關問題