You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:32:15