作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道为什么使用 with
打开文件对象语句或 block 中,退出后仍保留在范围内。是<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 中,新作用域(又名命名空间)仅为模块、类和函数创建,而不是为任何其他语句创建,尤其不是为 with
和 如果
block 。在 with
或 for
语句的主体内绑定(bind)的标识符因此绑定(bind)在最内层的周围范围内,这是您的情况下交互式解释器的顶级范围。只要此范围有效,标识符就会绑定(bind)在该范围内,或者直到它们被明确地从范围中删除(通过使用 del
,如 del fal
)。
对象只有在不再被引用时才能被清理。然而,这个对象真正被清理的实际时刻是不确定的。 Python 使用垃圾回收来进行内存管理,并且不强制执行特定策略。在使用引用计数的 CPython 中,一旦最后一个引用超出范围,就会立即清理对象。 PyPy 或 Jython 等替代实现使用更高级的垃圾收集器,它们可以在任意时间点清理未引用的对象。
这意味着,在您的示例中,绑定(bind)到 f
和 fal
的对象基本上不会被清理,因为交互式解释器的顶级范围自然存在只要 interpeter 在运行。但是请注意,这实际上不是问题,因为它们仍然正确关闭并且不再要求任何文件资源,而只是一些内存。
关于python - 为什么上下文会在 with 语句之后徘徊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021528/
我是一名优秀的程序员,十分优秀!