Python类中列表初始化问题:递归深度超限报错原因咨询
__init__中添加self.items = []能解决递归深度超出错误? 我完全懂你踩的这个坑——这个RuntimeError: maximum recursion depth exceeded本质是意外触发了无限递归调用,而你加的那行self.items = []刚好切断了这个递归链,咱们一步步拆解原因:
先还原你没加代码时的错误逻辑
虽然你没贴完整代码,但根据报错和修复方式,大概率你的类结构是这样的(非常典型的递归陷阱):
class Item: def __init__(self): # 这里没有初始化 self.items = [] pass @property def items(self): # 错误:在property的getter里又访问了self.items return self.items # 这里直接触发无限递归! def print2(self): # 当你访问self.items时,会调用上面的property for item in self.items: item.print2() # 调用时触发报错 item = Item() item.print2()
错误的根源:实例属性与类property的优先级冲突
当你没有在__init__里显式给实例绑定items属性时,Python会去类层面找同名的定义——也就是你写的那个@property装饰的items方法。
而这个property的getter方法里,你又不小心访问了self.items,这会再次触发这个getter,形成无限递归调用:print2() → 访问self.items → 调用items property → 访问self.items → 再次调用items property → ...直到触及Python的递归深度上限,抛出错误。
为什么加self.items = []就好了?
当你在__init__里添加self.items = []后,你给实例本身绑定了一个名为items的属性。在Python的属性查找顺序里,实例属性的优先级远高于类层面的property:
现在当print2()访问self.items时,Python会直接取实例上已经存在的空列表,完全不会再触发那个导致递归的items property,递归链被彻底切断,程序自然就能正常运行了。
额外提醒
如果你的代码里没有用@property,那还有一种可能:你在某个方法里错误地把self.items当成了列表,但实际上你没初始化它,反而在赋值时不小心调用了自身的方法(比如把方法名和属性名搞混了),但最常见的还是上面说的property递归陷阱。
内容的提问来源于stack exchange,提问作者TigerTV.ru

