首页 > 解决方案 > 如果我打开文件而不分配文件,它会保持打开状态吗?

问题描述

我知道

with open(my_file, 'r') as f:
    pass

打开和关闭文件。还,

f = open(my_file, 'r'); f.close()

做同样的事情。

那这个呢:

open(my_file, 'r')

我的实际问题案例是这样的:

import json;
json.load(open(my_file, 'r')) 

对比

import json;
with open(my_file, 'r') as f:
    j = json.load(f)

我想从技术上讲,文件应该保持打开状态,但我很确定由于文件对象没有被分配,它被 Python 的垃圾收集器立即关闭。

  1. 我对吗?
  2. 这是一个好习惯吗?
  3. 这里的 Python 版本有什么区别吗?

标签: python

解决方案


我很确定,由于没有分配文件对象,它立即被关闭。

在 CPython 实现中,open一旦引用计数减少到零,返回的对象将被删除。这与垃圾收集器无关,即使关闭 GC 也会发生。在文件句柄的情况下json.load(open(my_file, 'r'))将立即关闭,因为退出主体json.load将释放唯一的引用。

这是一个好习惯吗?

不会。文件句柄会及时关闭,这依赖于 CPython 的实现细节。这是一种“代码气味”,阅读您的代码的人可能会认为您是一个草率的程序员。使用该with语句来确保关闭的时间是明确的。如果您只是喜欢单线的外观,那么您可以使用pathlib,如下所示:

json.loads(Path(my_file).read_text())

这里的 Python 版本有什么区别吗?

不。


推荐阅读