[英]memory management with objects and lists in python
我試圖了解在函數中傳遞的賦值運算符,構造函數和參數在python中具體如何與列表和對象一起工作。 我有一個帶有列表作為參數的類。 我想將其初始化為一個空列表,然后使用構造函數填充它。 我不太確定該怎么做。
可以說我的班級是-
class A:
List = [] # Point 1
def __init1__(self, begin=[]): # Point 2
for item in begin:
self.List.append(item)
def __init2__(self, begin): # Point 3
List = begin
def __init3__(self, begin=[]): # Point 4
List = list()
for item in begin:
self.List.append(item)
listObj = A()
del(listObj)
b = listObj
我有以下問題。 如果有人能澄清每種情況下發生的事情,那將是非常棒的-
聲明第1點中的空白是否有效? 創造了什么? 指向NULL的變量?
Point 2和Point 3中哪個是有效的構造函數? 在第3點中,我猜想不會傳入(開始)的列表的新副本,而是變量List將指向指針“ begin”。 如果像第2點那樣使用構造函數,是否會創建列表的新副本?
當我使用del刪除對象時會發生什么? 列表也被刪除了嗎?還是必須在包含對象上調用del之前先在列表上調用del? 我知道Python使用GC,但是如果我擔心在GC啟動之前就清理未使用的內存,是否值得?
同樣將類型A的對象分配給另一個對象只會使第二個對象指向第一個右邊嗎? 如果是這樣,我該如何進行深拷貝? 有重載運算符的功能嗎? 我知道python可能比這個簡單得多,因此是個問題。
編輯:5.我只是意識到使用Point 2和Point 3並沒有什么不同。 列表開頭的項目僅通過引用進行復制,不會進行新的復制。 為此,我必須使用list()創建一個新列表。 我猜想起來,這很有意義。
謝謝!
為了:
關於您的編輯:就像我上面指出的那樣,在構造函數內部編寫List = list()時 ,不使用self。 (或者更好,因為變量是靜態的A. )前綴,您只是在創建一個空變量, 而不覆蓋您在類主體中定義的變量。
作為參考,將列表作為默認參數處理的通常方法是使用None占位符:
class A(object):
def __init__(self, arg=None):
self.startvalue = list(arg) if arg is not None else list()
# making a defensive copy of arg to keep the original intact
順便說一句,請看一下python教程。 它寫得很好,易於理解和理解。
“如果有人能澄清每種情況下發生的事情,那將非常棒”,這不是dis模塊的目的嗎? http://docs.python.org/2/library/dis.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.