首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

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

2013-07-11 
python lambda 表达式引起循环引用的问题并没有形成循环引用,但为什么析构函数就不被调用了呢有什么解决方

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

热点排行