Python類成員變量初始化的坑

  • 危險操作:在init()方法外直接定義列表或字典這類可變對象,如下NODE類中的children,這樣實例化的所有對象的children都會指向同一地址,導致修改一個對象的children列表,其他NODE對象的children列表都會一起改變,可通過id()函數檢測變量地址。但使用該方法定義int或字符串這類不可變對象時時安全的。
## 危險1:init方法外定義可變類型變量
class NODE:
	children = []
    def __init__(self):
        pass


## 危險2:init方法內定義但設置了默認參數
class NODE:
    def __init__(self, children=[1,2]):
		self.children = children
  • 安全的初始化操作如下,建議所有變量初始化在__init()__方法下進行,且可變類型的變量不可以設置默認函數參數,否則也會導致共享變量。
# 安全定義
class NODE:
    def __init__(self):
        self.children = []
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章