我觉得你对python闭包捕获对象方式理解不够深
建议转python版
【 在 VincentGe 的大作中提到: 】
: 标 题: Re: lambd表达式对已析构对象为啥不抛异常
: 发信站: 水木社区 (Sat Jan 27 17:17:39 2024), 站内
:
: 不,实际上在打印时签前面两个已经被析构了。
:
: 绑定到第三个是因为循环完成后,这个ai这个变量并没有被删除。或者说,Python并没有在循环中开新的内存空间
: 你看这个Python示例:
: class A:
: def __init__(self, i):
: print(f"init {type(i)}")
: self.i = i
: def p(self):
: print('>>', self.i)
: def __del__(self):
: print('del', self)
:
: def main():
: a = []
: for ai in [A(i) for i in range(3)]:
: a.append(lambda : ai.p())
: #del ai
: del ai
: for c in a:
: c()
:
: main()
:
: 【 在 MyWorkLife 的大作中提到: 】
: :
: : 你这个例子正好说明问题
: : 不像前面例子里面c++ lambda引用一个已经析构的空悬对象
: : python对于保持对象生存周期毫无压力
: : 只不过三个lambda错误地binding到了最后一个ai对象而已
:
: #发自zSMTH@CDU.MP
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 117.23.183.*]
--
FROM 223.72.88.*