垃圾回收器会在 .read() 之后删除引用吗?

  • 本文关键字:之后 删除 引用 read python
  • 更新时间 :
  • 英文 :


如果我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()确实返回了要"清理"的对象数量,因此可以确认我的思维过程没问题。 但正如我所说,我不是有经验的程序员,也许我错过或误解了一些东西。

最新更新