Jupyter中使用@property定义属性后Python内核崩溃原因排查
问题原因分析
核心崩溃原因:无限递归触发栈溢出
你写的dummy类里,@property定义的dum属性存在严重的无限递归问题:
- 当调用
self.dum(比如getter方法里的return self.dum),会触发dum的getter方法,而getter里又再次调用self.dum,形成无限递归循环。 - 同理,setter方法里的
self.dum = value会触发dum的setter方法,setter里又再次赋值self.dum,同样陷入无限递归。
这种无限递归会快速耗尽Python的调用栈内存,最终导致内核直接崩溃,没有错误提示(因为栈溢出属于底层错误,Python来不及输出错误信息)。
额外的潜在问题:默认可变参数陷阱
虽然这不是导致本次崩溃的直接原因,但__init__方法里dum: List =[]使用可变对象(空列表)作为默认参数,会导致所有dummy实例共享同一个列表对象,这是Python中常见的坑,后续使用时很容易出现意料之外的行为。
修复方案
把属性的内部存储变量改名(比如用_dum),避免和property名称冲突,同时修复默认可变参数的问题:
from typing import List class dummy: def __init__(self, dum: List = None): self._dum = dum if dum is not None else [] @property def dum(self) -> List: return self._dum @dum.setter def dum(self, value: List) -> None: self._dum = value
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

