Python类可变默认参数导致内部实例化异常问题咨询
问题原因分析
这是Python中可变默认参数的经典陷阱,核心原因是:Python的函数(包括类的__init__方法)的可变默认参数只会在函数定义时初始化一次,而非每次调用函数时重新创建。
具体拆解:
- 你的
ndarray类的__init__方法大概率是类似这样的写法:
这里的默认空列表def __init__(self, array=[]): self.array = array[]是在类定义阶段就创建好的全局对象,所有通过ndarray()(不传参数)创建的实例,都会共享这同一个列表对象。 - 单次运算(如
a*b)时,第一次调用ndarray(),self.array指向这个默认空列表,运算后修改的是这个列表,但此时只有这一个实例在用,看起来符合预期。 - 二次运算(如
z1+c)时,再次调用ndarray(),Python不会重新生成新的空列表,而是直接复用之前已经被修改过的那个默认列表,所以新实例的self.array就带着前一次运算的结果了。
为什么ndarray([])就正常?
当你显式传入[]时,每次调用都会创建一个全新的空列表对象,每个实例的self.array都是独立的,自然不会出现复用的问题。
正确的写法
把默认参数设为None,在方法内部初始化空列表,避免共享:
def __init__(self, array=None): if array is None: array = [] self.array = array
内容的提问来源于stack exchange,提问作者ai-py
相关产品推荐
相关产品推荐

