读书人

python lambda 表达式引起循环引用的有

发布时间: 2013-07-11 15:38:46 作者: rapoo

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

[解决办法]

引用:
Quote: 引用:

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

读书人网 >perl python

热点推荐