Python矩阵类初始化触发递归深度超限错误求解决方案
解决Matrix类转置属性导致的递归超限问题
错误原因
你当前的代码在__init__方法中直接执行self.T = self.__transposition(),而__transposition方法会创建一个新的Matrix实例。新实例初始化时又会执行self.T = self.__transposition(),进而创建更多实例,形成无限递归,最终触发RecursionError。
解决方案
不要在初始化时直接生成转置矩阵并赋值给self.T,而是使用@property装饰器将转置逻辑定义为延迟计算的属性,只有当访问.T时才会生成转置矩阵。
调整后的代码如下:
import random import typing class Matrix: def __init__( self, rows: int=None, columns: int=None, values: list[int | float | list[int | float]]=None ) -> None: self.__rows = 3 if not rows else (3 if rows <= 0 else rows) self.__columns = 3 if not columns else (3 if columns <= 0 else columns) # 修正原代码中self.get_columns的错误,改为self.__columns if not values: if self.__rows != 1: self.__values = [ [random.randint(-10, 10) for _ in range(self.__columns)] for _ in range(self.__rows) ] else: self.__values = [random.randint(-10, 10) for _ in range(self.__columns)] else: self.__values = values @property def T(self) -> typing.Self: # 原__transposition方法的逻辑移到这里,作为属性的 getter transposed_values = [ [self.__values[j][i] for j in range(self.__rows)] for i in range(self.__columns) ] return Matrix( rows=self.__columns, columns=self.__rows, values=transposed_values ) # 可选:添加__str__方法,方便打印矩阵内容 def __str__(self) -> str: return '\n'.join([' '.join(map(str, row)) for row in self.__values]) if __name__ == '__main__': a = Matrix(rows=2) print("原矩阵:") print(a) print("\n转置矩阵:") print(a.T)
关键修改点
- 移除
__init__中的self.T = self.__transposition()语句,避免初始化时触发递归 - 将原
__transposition方法改为@property装饰的T属性,实现延迟计算 - 修正了原代码中
self.get_columns的错误(类中未定义该方法,改为直接访问self.__columns) - 添加了
__str__方法,让矩阵打印更直观
这样修改后,只有当你访问矩阵的.T属性时,才会创建转置矩阵,不会在初始化时触发无限递归。
内容的提问来源于stack exchange,提问作者egorka_angelskiy
相关产品推荐
相关产品推荐

