栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

读取整个文件是否会使文件句柄保持打开状态?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

读取整个文件是否会使文件句柄保持打开状态?

这个问题的答案在某种程度上取决于特定的Python实现。

要了解所有内容,请特别注意实际

file
对象。在您的代码中,该对象仅在表达式中被提及一次,并且在
read()
调用返回后立即变得不可访问。

这意味着文件对象是垃圾。剩下的唯一问题是“垃圾收集器何时收集文件对象?”。

在使用引用计数器的CPython中,这种垃圾立即被注意到,因此将立即被收集。这通常不适用于其他python实现。

确保该文件已关闭的一种更好的解决方案是以下模式:

with open('Path/to/file', 'r') as content_file:    content = content_file.read()

块结束后,它将始终立即关闭文件;即使发生异常。

编辑:在上面提出一个更好的点:

除了

file.__exit__()
,这是在
with
上下文管理器设置中“自动”调用的,唯一
file.close()
可以自动调用的其他方式(即,除了自己明确调用之外)是via
file.__del__()
。这就引出了我们什么时候
__del__()
打电话的问题?

正确编写的程序不能假定终结器将在程序终止之前的任何时候运行。

-
https://devblogs.microsoft.com/oldnewthing/20100809-00/?p=13203

特别是:

从不显式销毁对象。但是,当它们变得不可访问时,它们可能会被垃圾回收。 允许实现推迟垃圾回收或完全忽略垃圾回收
–只要没有收集仍可到达的对象,垃圾回收的实现方式就取决于实现质量。

[…]

CPython当前使用带有循环计数垃圾的(可选)延迟检测的引用计数方案,该方案会在无法访问时立即收集大多数对象,但不能保证收集包含循环引用的垃圾。

- https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-
types

(强调我的)

但正如它暗示的那样,其他实现可能具有其他行为。例如,PyPy有 6
种不同的垃圾回收实现!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623811.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号