如果我file_data = open(...).read()
读取文件,我将有"file_data"引用来自"read(("的数据,并且我不会引用文件描述符。对吗?这是否意味着如果文件描述符有 0 个链接,垃圾回收器会删除它吗?或者文件描述符有 1 个指向打开文件的链接,我需要手动关闭文件?
上级:
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.txt
data = open("foo.txt").read()
# <- brakepoint here
$ lsof foo.txt
-
如果您编写该代码,则需要希望类似文件的对象的__del__
方法将关闭基础文件,因为您自己没有引用来执行此操作。请改用with
语句:
with open(...) as f:
file_data = f.read()
我已经尝试过你的例子,我得到了:
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()
确实返回了要"清理"的对象数量,因此可以确认我的思维过程没问题。 但正如我所说,我不是有经验的程序员,也许我错过或误解了一些东西。