如果我读取一个文件file_data = open(...).read(),就会有"file_data“,它引用" read ()”中的数据,而不会引用文件描述符。是对的?这是否意味着如果文件描述符有0链接,垃圾收集器会删除它吗?或者文件描述符有一个链接到打开的文件,而我需要手动关闭该文件?
UPD:
data = open("foo.txt")
# <- brakepoint here
$ lsof foo.txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 17249 q 5r REG 8,3 0 1443322 foo.txtdata = open("foo.txt").read()
# <- brakepoint here
$ lsof foo.txt
-发布于 2020-02-08 20:51:38
如果您编写了该代码,您需要希望类似文件的对象的__del__方法将关闭底层文件,因为您自己没有引用可以这样做。使用with语句代替:
with open(...) as f:
file_data = f.read()发布于 2020-02-08 21:09:48
我试过你的例子,这就是我所得到的:
import gc
gc.disable()
file_data = open('somefile').read()
gc.collect() # The number of unreachable objects found is returned.
>>> 0我不是高级程序员,但对我来说,似乎没有任何文件描述符被视为垃圾。
让我们创建一个示例,在这里我们可以确定会有垃圾需要收集:
class A:
def __init__(self):
self.b = B(self)
class B:
def __init__(self, a):
self.a = a
import gc
gc.disable()
my_var = A()
my_var = None
gc.collect()
>>>4 # The number of unreachable objects found is returned.似乎gc.collect()确实返回了许多对象以“清除”,因此它将确认我的思维过程是正常的。但正如我所说,我不是有经验的程序员,也许我错过或误解了什么。
https://stackoverflow.com/questions/60131055
复制相似问题