簡體   English   中英

使用python中的對象和列表進行內存管理

[英]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. 聲明第1點中的空白是否有效? 創造了什么? 指向NULL的變量?

  2. Point 2和Point 3中哪個是有效的構造函數? 在第3點中,我猜想不會傳入(開始)的列表的新副本,而是變量List將指向指針“ begin”。 如果像第2點那樣使用構造函數,是否會創建列表的新副本?

  3. 當我使用del刪除對象時會發生什么? 列表也被刪除了嗎?還是必須在包含對象上調用del之前先在列表上調用del? 我知道Python使用GC,但是如果我擔心在GC啟動之前就清理未使用的內存,是否值得?

  4. 同樣將類型A的對象分配給另一個對象只會使第二個對象指向第一個右邊嗎? 如果是這樣,我該如何進行深拷貝? 有重載運算符的功能嗎? 我知道python可能比這個簡單得多,因此是個問題。

編輯:5.我只是意識到使用Point 2和Point 3並沒有什么不同。 列表開頭的項目僅通過引用進行復制,不會進行新的復制。 為此,我必須使用list()創建一個新列表。 我猜想起來,這很有意義。

謝謝!

為了:

  1. 使用這種形式只是調用列表構造函數的語法糖-即,您正在創建一個新的(空)列表。 這將綁定到類本身(是一個靜態字段),並且對於所有實例都是相同的。
  2. 除了必須始終為init的構造函數名稱之外,兩者均為有效形式,但含義不同。
    • 可以使用列表作為參數或不使用列表來調用第一個構造函數。 如果調用時不帶參數,則使用默認傳遞的空列表(該空列表在類定義期間創建一次,而不是在每次構造函數調用時創建一次),因此不會將任何項目添加到靜態列表中。
    • 第二個必須使用list參數調用,否則python會報錯,但在沒有self的情況下使用它 像您這樣做的前綴一樣,它只會創建一個新的局部變量名稱List ,只能在構造函數中訪問,而將靜態A.List變量保留不變。
  3. 刪除只會取消對對象的引用,而不會真正刪除任何內容。 但是,一旦除去所有引用,垃圾收集器就可以根據需要自由清除內存。 嘗試控制垃圾收集器通常是一個壞主意。 代替。 只要確保您不再持有對不再需要的對象的引用,並使其起作用即可。
  4. 為對象分配變量只會創建對同一對象的新引用。 要創建深層副本,請使用相關功能或編寫自己的功能
  5. 可以通過在類定義中覆蓋一些特殊的方法來實現運算符重載(謹慎使用,可能會使事情更加混亂,而不是被誤用)。

關於您的編輯:就像我上面指出的那樣,在構造函數內部編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM