python lambda 表达式引起循环引用的问题
并没有形成循环引用,但为什么析构函数就不被调用了呢
有什么解决方法
[解决办法]
lambda: self._a.run()
因为t=Test()执行时,该lambda并不会执行,所以该lambda会保存对self的引用,而不是对self._a引用。
下面的代码中,先取self._a(或self._a.run也可以)的值放在tmp中,再在lambda中引用tmp,最后结果会输出“del test”。
# encoding: utf-8
class A():
def run(self):
print "hello"
class B():
def __init__(self, call):
self._call = call
class Test():
def __init__(self):
self._a = A()
#self._b = B(self._a.run) # 使用这句代替lambda表达式可以输出"del Test"
tmp = self._a.run
self._b = B(lambda : tmp())
def __del__(self):
print "del Test"
t = Test()
t = None
------解决方案--------------------
self._b = B(lambda self: self._a.run())
经测试可以输出 del Test
[解决办法]
这儿的self是形参,不再是指代自身的self了,自然也不会保留对自身的引用。例如,调用t._b._call要写:
t._b._call(t)
你的例子里,是这样调用:
t._b._call()
[解决办法]
self._b = B(lambda self: self._a.run())
经测试可以输出 del Test
上面那个想岔了,如果你想输出hello 这样可以
def __init__(self):
self._a = A()
# self._b = B(self._a.run) # 使用这句代替lambda表达式可以输出"del Test"
self._b = B(lambda : self._a.run())
self._b._call() #这里才会进行函数调用
不会输出del Test 应该是因为lambda表达式持有了Test实例的引用
关于这个的具体情况,可以找找闭包的资料看看
t = Test()
t._b._call =None #这里也置空就会输出del Test
t = None