【发布时间】:2011-11-15 18:27:52
【问题描述】:
在 Python 中,如果您打开文件而不调用 close(),或者关闭文件但不使用 try-finally 或“with”语句,这是一个问题吗?或者作为一种编码实践,依靠 Python 垃圾收集来关闭所有文件就足够了吗?例如,如果这样做:
for line in open("filename"):
# ... do stuff ...
...这是一个问题,因为文件永远无法关闭,并且可能发生阻止它被关闭的异常?还是肯定会因为文件超出范围而在 for 语句结束时关闭?
【问题讨论】:
-
文件不在
for块末尾超出范围。它的引用计数将归零,导致它自动关闭,但只有函数、类和模块在 Python 中定义范围,而不是其他复合语句。 -
除非有问题,否则不是问题。在操作系统级别,脚本打开的任何文件都会在脚本退出时关闭,因此您不必担心在一次性工具脚本中关闭文件。但是,进程对它们可以维护的打开文件的数量有限制,因此长期或复杂的脚本可能需要更加小心。无论如何,关闭文件是一个好习惯。
-
@agf:文件没有超出范围是对的,但这与
for块和函数/类/模块之间的区别无关。它比这简单得多:对象没有范围,只有名称有。没有引用此对象的名称,因此这里没有任何东西可以留在范围内或超出范围。 -
@max 我的评论纠正了他的假设,即存在与
for循环相关的范围,并提到文件因完全不同的原因而关闭。它没有涉及 Python 中的 什么作用域,因为它在这里不相关。 -
@max 有一个隐式引用,范围是 for 循环......这是语义的一个参数
标签: python file garbage-collection