2010-11-10 20 views
2

如果我在python函數中創建一個列表並將其返回給調用者,那麼垃圾收集如何在該列表中工作?我必須做任何事情來防止發生內存泄漏嗎?在函數中創建和返回的動態列表是否會在Python中創建內存泄漏?

例如:

#!/usr/bin/python 

import random 

class Example: 
    def f1(self): 
     list = [] 
     len = random.randint(0, 30) 
     for i in range (0, len): 
       list.append(random.randint(0, 65536)) 
     return list 


random.seed(None) 

e = Example() 
while (1): 
    l = e.f1() 

這會不會導致內存泄漏? f1()中的'list'是否在任何時候都有適當的引用計數? f1()的調用者是否必須做任何事情來防止發生內存泄漏?調用者應該在列表上做一個del()還是什麼?

+4

'list'是一個保留的Python關鍵字,建議您不要使用它作爲列表的名稱。 – soulseekah 2010-11-10 11:36:29

+0

是啊,是的...使用alist,rlist代替 – Ant 2010-11-10 11:36:56

+1

你也應該避免調用一個變量'len',因爲這會掩蓋對'len'內建函數的訪問。 – mikej 2010-11-10 11:50:47

回答

6

這裏沒有內存泄漏。分配給l的列表是在該函數中生成的相同的列表。 Python傳遞對象,而不是引用或值。

Python會跟蹤對該列表的引用:在while循環的每次迭代中,會創建一個新列表並將其分配給l。這會導致前一個不再有任何引用,因此它將被刪除。

+0

** Python將引用**(對象)傳遞給 - 例如「引用」。 Java感,而不是C++意義上的引用。這就是爲什麼def f(x):x = Stuff()在def g(x):x.ham = Ham()方法中改變參數的原因。 – delnan 2010-11-10 16:26:59

2

在Python這一切都自動...大部分時間你沒有在這種情況下,擔心垃圾收集...

中,func創建一個列表並返回它。那麼你將它分配給l。

一旦值賦給一個非空的變種,它只是拋出的第一個值,不存在內存泄漏,你不」必須使用德爾..

它,冷靜,不它? :)

相關問題