我知道
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的垃圾收集器关闭了。
我非常确定,由于未分配文件对象,因此立即将其关闭。
在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版本之间有何区别?
没有。