是否值得在小函数中关闭文件?

Ioa*_*ucu 8 python garbage-collection file

说你有:

def my_func():
    fh = open(...)
    try:
        print fh.read()
    finally:
        fh.close()
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是:是否值得使用try/finally(或with)语句?当函数终止时(通过垃圾收集),文件是否仍然关闭?

我在阅读了Martelli的"蟒蛇食谱"中的食谱之后看到了这一点

all_the_text = open('thefile.txt').read()
Run Code Online (Sandbox Code Playgroud)

附带注释:"当你这样做时,一旦读取操作完成,你就不再有文件对象的引用.实际上,Python会立即注意到缺少引用,并立即关闭文件."

我的功能示例几乎相同.你有一个参考,只是参考的寿命很短.

我的第二个问题是:马尔泰利的陈述中"立即"是什么意思?即使您根本没有引用,但是文件关闭是否仍然发生在垃圾收集时间?

Sim*_*ser 12

最好自己关闭文件.使用该with语句可以获得干净的代码,并自动关闭文件(这是一件好事).

尽管Python是一种高级编程语言,但您仍然需要掌控自己正在做的事情.根据经验:如果您打开文件,也需要关闭它.你的代码中没有充分的理由邋 - :-)

关于你的第二个问题:它不会立即运行,它将在垃圾收集器决定运行时运行.当文件对象被释放时,Python将关闭该文件.这里有一些 关于Python中的垃圾收集的文章(也参见gc模块),这是一个有趣的阅读.

它还显示Python的垃圾收集在决定垃圾收集之前使用基于已分配和已释放对象数量的阈值.如果您的文件很大,那么Python可能会将文件打开的时间超过必要的时间,因为垃圾收集代码可能尚未运行.

  • 很公平.对我来说更有趣的是引擎盖下发生的事情以及一旦引用计数降至0后会发生什么.请参阅我的编辑(包含关于Martelli的"立即"声明的第二个问题). (2认同)
  • 您应该注意CPython使用引用计数和垃圾收集的混合,因此在简单的情况下,垃圾会在最后一个引用被销毁时立即收集. (2认同)