我想知道为什么使用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>
Run Code Online (Sandbox Code Playgroud)
lun*_*orn 16
在Python中,新的作用域(aka名称空间)仅为模块,类和函数创建,但不为任何其他语句创建,尤其不适用于with和if块.绑定在body with或for语句体内的标识符因此绑定在最内层的范围内,这是您的案例中交互式解释器的顶级范围.只要此范围有效,或者直到从范围中显式删除标识符(通过使用delas del fal),标识符就会绑定在范围中.
只有在不再引用对象时才能清除对象.然而,实际清理此对象的实际时刻是未定义的.Python使用垃圾收集进行内存管理,并不强制执行特定策略.在使用引用计数的CPython中,一旦最后一个引用超出范围,就会立即清理对象.像PyPy或Jython这样的替代实现使用更高级的垃圾收集器,它可以在任意时间点清理未引用的对象.
这意味着,在您的示例中,绑定到f并且fal基本上永远不会清理的对象,因为只要互操作程序正在运行,交互式解释器的顶级范围就会自然存在.但请注意,这实际上并不是一个问题,因为它们仍然正确关闭,不再声明任何文件资源,而只是一些内存.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |