Python 发生break语句时生成器将被销毁
我想知道Obj.del()方法 会被叫来的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
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