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 = []

你可能感兴趣的:(学习)