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

Python 垃圾收集器会在.read()之后删除引用吗?,python,Python,如果我读取一个文件file\u data=open(…).read(),我将拥有“file\u data”,它引用来自“read()”的数据,而我不会获得引用文件的描述符。是吗?这是否意味着如果文件描述符有0个链接,垃圾收集器会删除它?或者文件描述符有一个指向打开文件的链接,我需要手动关闭该文件 UPD: data = open("foo.txt") # <- brakepoint here $ lsof foo.txt COMMAND PID USER FD TYPE D

如果我读取一个文件
file\u data=open(…).read()
,我将拥有“file\u 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.txt

data=open(“foo.txt”)

#如果编写该代码,您需要希望类似于对象的
\uu del\uu
方法的文件将关闭底层文件,因为您自己没有这样做的引用。改为将
语句一起使用:

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()
确实返回了要“清理”的对象数,这样就可以确认我的思考过程是正常的。
但正如我所说,我不是一个经验丰富的程序员,可能会错过或误解一些东西。

上下文管理器是一个不错的选择。但我想了解垃圾收集器在我的系统中的行为example@elektruver:文件的
\uu del\uu()
方法可能会关闭该文件,但Python中无法保证会调用它。最好自己关闭它,或者使用带有上下文管理器的
。当脚本结束时,如果文件仍然打开,操作系统将关闭该文件。垃圾收集器的行为是特定于实现的,通常是不可预测的。你不应该依赖它做任何特别的事情,除非(最终)在需要的时候收集任何垃圾。像这样显式调用
gc.collect()
可能会影响报告的结果……所以在“似乎没有被视为垃圾的文件描述符”中没有任何证明。这不一定是真的;由于没有循环引用,因此当refcount减少时,它可能会自动收集,而GC不会这样做。问题可能是关于文件对象的,在这方面还不清楚,所以我不确定讨论垃圾收集是否适用。CPython
GC
模块用于循环垃圾。非循环引用纯粹是通过引用计数来处理的,根据定义,它们实际上从来都不是垃圾。问题中的情况不是由
gc
处理的。请注意,垃圾收集的时间是由实现定义的。语言规范不保证何时或是否回收内存。这是否回答了您的问题:
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.