如果我打开文件而不分配文件,它会保持打开状态吗?

CIs*_*ies 1 python

我知道

with open(my_file, 'r') as f:
    pass
Run Code Online (Sandbox Code Playgroud)

打开和关闭文件。也,

f = open(my_file, 'r'); f.close()
Run Code Online (Sandbox Code Playgroud)

一样。

那这个呢:

open(my_file, 'r')
Run Code Online (Sandbox Code Playgroud)

我的实际问题是这样的:

import json;
json.load(open(my_file, 'r')) 
Run Code Online (Sandbox Code Playgroud)

import json;
with open(my_file, 'r') as f:
    j = json.load(f)
Run Code Online (Sandbox Code Playgroud)

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

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

wim*_*wim 5

我非常确定,由于未分配文件对象,因此立即将其关闭。

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

这是一个好习惯吗?

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

json.loads(Path(my_file).read_text())
Run Code Online (Sandbox Code Playgroud)

这里的Python版本之间有何区别?

没有。