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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:57:42