我想知道为什么使用with语句或在一个块中打开的文件对象在退出后仍保留在作用域中。是否已清理<closed file>对象?

>>> with open('test.txt','w') as f:
...     f.write('test')
...
>>> f
<closed file 'test.txt', mode 'w' at 0x00E014F0>
>>> f.close()


>>> if True:
...     fal = open('demo.txt','w')
...     fal.write('stuff')
...     fal.close()
...
>>> fal
<closed file 'demo.txt', mode 'w' at 0x00E015A0>

最佳答案

在Python中,仅为模块,类和函数创建新的作用域(即 namespace ),而不为其他任何语句创建,特别是为withif块创建。因此,绑定(bind)在withfor语句主体内的标识符将绑定(bind)在最内部的范围内,该范围在您的情况下是交互式解释器的顶级范围。只要此范围有效,标识符就绑定(bind)到范围中,或者直到将它们从范围中显式删除(通过像del中一样使用del fal)为止。

仅当不再引用对象时才可以清除它们。但是,该对象真正被清除的实际时间是不确定的。 Python使用垃圾回收进行内存管理,并且不执行特定策略。在使用引用计数的CPython中,一旦最后一个引用超出范围,对象将立即被清除。诸如PyPy或Jython之类的替代实现使用更高级的垃圾收集器,这些垃圾收集器会在任意时间点清除未引用的对象。

这意味着,在您的示例中,基本上不会清理绑定(bind)到ffal的对象,因为只要运行了插入程序,交互式解释器的顶级范围就自然存在。但是请注意,这实际上不是问题,因为它们仍然正确关闭并且不再声明任何文件资源,而仅声明了一些内存。

关于python - 为什么在with语句后上下文仍然徘徊?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5021528/

10-14 20:06
查看更多