我想知道为什么使用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 ),而不为其他任何语句创建,特别是为with
和if
块创建。因此,绑定(bind)在with
或for
语句主体内的标识符将绑定(bind)在最内部的范围内,该范围在您的情况下是交互式解释器的顶级范围。只要此范围有效,标识符就绑定(bind)到范围中,或者直到将它们从范围中显式删除(通过像del
中一样使用del fal
)为止。
仅当不再引用对象时才可以清除它们。但是,该对象真正被清除的实际时间是不确定的。 Python使用垃圾回收进行内存管理,并且不执行特定策略。在使用引用计数的CPython中,一旦最后一个引用超出范围,对象将立即被清除。诸如PyPy或Jython之类的替代实现使用更高级的垃圾收集器,这些垃圾收集器会在任意时间点清除未引用的对象。
这意味着,在您的示例中,基本上不会清理绑定(bind)到f
和fal
的对象,因为只要运行了插入程序,交互式解释器的顶级范围就自然存在。但是请注意,这实际上不是问题,因为它们仍然正确关闭并且不再声明任何文件资源,而仅声明了一些内存。
关于python - 为什么在with语句后上下文仍然徘徊?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5021528/