Python 发生break语句时生成器将被销毁

Python 发生break语句时生成器将被销毁,python,generator,Python,Generator,我想知道Obj.del()方法 会被叫来的 def my_integers(): Obj = ExitObj() i = 0 while(1): yield i i += 1 def test_fun(): for i in my_integers(): if i > 3: break anything_function() test_fun() 我做了一个测试,Obj似乎在brea

我想知道Obj.del()方法 会被叫来的

def my_integers():
    Obj = ExitObj()
    i = 0
    while(1):
        yield i
        i += 1
def test_fun():
    for i in my_integers():
        if i > 3:
            break 
anything_function()
test_fun()
我做了一个测试,Obj似乎在break语句之后被删除:在anywhere_函数()退出循环之前

当循环留给生成器中定义的对象的_uuu_uu_u_uu_u_u_u_u_u_u_u_u_u_u_uu方法时,我可以依靠这一点并给出一些我想要完成的任务吗

我想知道何时调用
Obj.\uu del\uu()
方法

你不能。也许永远不会。Python中的终结器(或者在任何具有自动垃圾收集器方案的环境中)根本不能保证运行,只能用于最后的清理。如果您想要可预测的生命周期管理,请使用和


一般来说,您不能依赖析构函数调用命令。当垃圾收集器回收对象时,将调用析构函数。这可能会在不确定的将来发生,或者如果您的程序因异常而死亡,则根本不会发生


如果你想为你的对象设置一个威慑生命周期,考虑并使用<<代码> 语句。

< P>这里是Python语言引用必须说的回合,

x.\uuu del\uuu()
-。。。仅当x的引用计数达到零时调用。一些可能阻止对象的引用计数变为零的常见情况包括:对象之间的循环引用;对捕获异常的函数堆栈帧上的对象的引用

因此,您不应该依靠
\uuu del\uu
进行清理。上下文管理器(如Cat Plus)是正确的选择

class Foo(object):
    def __enter__(self):
        print 'Entered with block'
    def __exit__(self, *exc_info):
        print 'Exited with block'
        return False

with Foo():
    pass