Python类对象疑问:为何两个实例共享同一列表属性?
Python类默认参数导致的列表共享问题
问题原因
Python中,函数的默认参数是在函数定义阶段就创建的,而非每次调用函数时重新生成。你的Node类里,__init__方法的默认参数x = []会在类定义时创建一个空列表对象,之后每次调用Node()(不传参数时),都会复用这个同一个列表对象。所以a.x和b.x指向的是内存中的同一个列表,对其中一个做append操作,另一个也会同步看到变化。
你可以用id()函数验证这一点:
a = Node() b = Node() print(id(a.x)) # 输出与下方id完全相同 print(id(b.x))
解决方法
把默认参数设为None,然后在__init__方法内部判断:如果x是None,就创建一个新的空列表。这样每次调用Node()时,都会生成独立的新列表,彻底避免共享问题:
class Node: def __init__(self, x=None): self.x = x if x is not None else [] a = Node() b = Node() a.x.append(3) b.x.append(5) print(a.x) # 输出 [3] print(b.x) # 输出 [5]
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

