首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集器会在.read()之后删除引用吗?

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

Stack Overflow用户
提问于 2020-02-08 20:48:05
回答 2查看 162关注 0票数 1

如果我读取一个文件file_data = open(...).read(),就会有"file_data“,它引用" read ()”中的数据,而不会引用文件描述符。是对的?这是否意味着如果文件描述符有0链接,垃圾收集器会删除它吗?或者文件描述符有一个链接到打开的文件,而我需要手动关闭该文件?

UPD:

代码语言:javascript
复制
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
代码语言:javascript
复制
data = open("foo.txt").read()
# <- brakepoint here

$  lsof foo.txt
-
EN

回答 2

Stack Overflow用户

发布于 2020-02-08 20:51:38

如果您编写了该代码,您需要希望类似文件的对象的__del__方法将关闭底层文件,因为您自己没有引用可以这样做。使用with语句代替:

代码语言:javascript
复制
with open(...) as f:
    file_data = f.read()
票数 3
EN

Stack Overflow用户

发布于 2020-02-08 21:09:48

我试过你的例子,这就是我所得到的:

代码语言:javascript
复制
import gc

gc.disable()
file_data = open('somefile').read()
gc.collect() # The number of unreachable objects found is returned.
>>> 0

我不是高级程序员,但对我来说,似乎没有任何文件描述符被视为垃圾。

让我们创建一个示例,在这里我们可以确定会有垃圾需要收集:

代码语言:javascript
复制
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()确实返回了许多对象以“清除”,因此它将确认我的思维过程是正常的。但正如我所说,我不是有经验的程序员,也许我错过或误解了什么。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60131055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档