2014-01-27 60 views
2

我有一個python對象,它基本上是其他對象實例的集合。你可以附加其他對象(它只是存儲在一個列表中)。讀取文件,例如,當它被創建:覆蓋對象實例不釋放內存?

def file_reader(file): 
    obj = MyCollection() 

    for line in file: 
     other_obj = line_reader(line) 
     obj.append(other_obj) 
    return obj 

如果我之後嘗試覆蓋對象(通過讀取不同的文件),原始數據不會被刪除,對象只是延長。奇怪的是,這似乎發生,如果我使用不同的引用:

obj1 = file_reader(file) 
obj2 = file_reader(file1) 

我懷疑我有某種與循環引用的問題,但我不能完全把握的邏輯。 任何人有想法?

編輯: MyCollection的的重要組成部分看起來像:

class MyCollection(object): 

    def __init__(self, objs = []): 
     self.objs = objs 

    def append(self, obj): 
     self.objs.append(obj) 
+2

你能顯示'MyCollection的()'的代碼?我敢打賭,這個列表是一個類屬性,而不是一個實例屬性。 – jonrsharpe

+0

您能否提供給我們,使用'MyCollection'對象的代碼?這可能會有所幫助。 – Marek

+0

編輯該問題添加收藏類 – jramm

回答

6

我要一個不那麼胡亂猜測,你目前有這樣的事情:

class MyCollection(): 
    listOfThings = [] 
    def __init__(self): 

在這case,listOfThings類屬性,它在MyCollection類的所有實例中共享。相反,你想要一個實例屬性,單獨爲每個實例:

class MyCollection(): 
    def __init__(self): 
     self.listOfThings = [] 

編輯:這麼近!

你的問題是:

def __init__(self, objs = []): 

這裏,objs被稱爲 「可變默認參數」。默認參數值中的列表將被不作爲傳遞給__init__(例如,將創建一個帶有單獨的objs列表的新實例)的該類的所有實例共享。

你應該使用:

def __init__(self, objs=None): 
    if objs is None: 
     objs = [] 
+0

非常感謝!我不得不查找'可變的默認參數',並presto,我的確切例子是在指南:http://docs.python-guide.org/en/latest/writing/gotchas/ – jramm

+0

順便說一句,列表不被用作實際的班級與其他方法相比要大一些。你碰到問題了:) – jramm

+0

是的,這是一個非常容易找到信息的典型例子,但只有當你已經知道它叫什麼的時候! – jonrsharpe