Python继承中默认列表参数被覆盖问题求助
问题分析与解决方案
嘿,这是Python里可变默认参数的经典陷阱,我来给你掰扯清楚!
为什么会出现实例间互相影响的情况?
Python中,函数的默认参数是在函数定义的那一刻就初始化完成的,而不是每次调用函数时重新创建。你代码里的family=[],这个空列表其实是一个固定的内存对象——所有没有主动传递family参数的Person或Woman实例,都会共享这同一个列表。
当你给实例a调用add_family("john")时,其实是在修改这个共享的列表;而实例b创建时因为没传family,用的还是同一个列表,所以自然会看到['john'],反过来修改b的列表也会影响a。
怎么修复这个问题?
我们只需要把可变默认参数换成不可变的占位符(比如None),然后在函数内部创建新的可变对象即可,这样每个实例都会拥有独立的列表:
修改后的代码如下:
class Person: def __init__(self, family=None, name="Jim"): # 如果没传family,就创建新的空列表 self._family = family if family is not None else [] self._name = name def get_family(self): return self._family class Woman(Person): def __init__(self, family=None, name="Jane"): # 保持原打印逻辑的话,可以调整为下面这行 # print(family if family is not None else []) print(family) # 同样处理后再传给父类 Person.__init__(self, family if family is not None else [], name) def add_family(self, name): self._family += [name] if __name__ == "__main__": a = Woman() a.add_family("john") print(a.get_family()) b = Woman() print(b.get_family()) print(a.get_family())
修改后的输出
None ['john'] None [] ['john']
(如果想保持原代码里print(family)输出[]的效果,把Woman类里的print(family)改成print(family if family is not None else [])即可)
这样实例a和b的_family就完全独立啦,再也不会互相影响~
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

