Python文件别名什么时候被CG回收?

握草 2018-04-12 09:12:46

>>> with open('f.txt', 'w') as f:
f.write(r.text[2000:3000])
>>> f
<_io.TextIOWrapper name='f.txt' mode='w' encoding='UTF-8'>

问题是:根据Python的上下文管理器,退出with语句块后,f不是应该就消失了吗?为什么还可以看到

而且:
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'f', 'os', 'r', 'request', 'requests']

在dir()中也可以清楚的看到f。

那么,f作为文件对象的别名,到底什么时候消失??

================================================

最好能结合实例说说大家的理解。
...全文
811 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
握草 2018-04-13
  • 打赏
  • 举报
回复
谢谢!明白了。那我问一下。 既然这里f被with语句关闭了,也就没有用了。 为什么还保留在dir()中呢?这样不是浪费资源吗?
握草 2018-04-13
  • 打赏
  • 举报
回复
既然这里f被with语句关闭了,也就没有用了。 为什么还保留在dir()中呢?这样不是浪费资源吗 ======================================== Who can tell me why?
混沌鳄鱼 2018-04-13
  • 打赏
  • 举报
回复
你在IDLE中python shell中执行的东西, 都要等把shell关闭了才能释放资源,这个是特殊情况。 这个和直接在命令行,python abc.py 执行是不同的。
  • 打赏
  • 举报
回复
with open('f.txt', 'w') as f: f.write(r.text[2000:3000]) 就拿这个来说,你在后面都可以直接使用f来获取数据(当然已经执行过关闭文件了),只有当这个程序关闭的时候,f才会销毁,或者手动去销毁
混沌鳄鱼 2018-04-12
  • 打赏
  • 举报
回复
这是因为你把with 的功能理解错了。 with之后只是把f这个文件对象变成了关闭状态了,而不是销毁。 del f 才销毁。
握草 2018-04-12
  • 打赏
  • 举报
回复
我也觉得GC嘛……回收的都是对象。 这里f只是别名。 但是类似的说法,我们讲f销毁。(姑且这么说吧 那么f被销毁,被发生在什么时候呢?有什么判断依据吗?
oyljerry 2018-04-12
  • 打赏
  • 举报
回复
这里with还在有效区间。释放要等到gc真正发生的时候
握草 2018-04-12
  • 打赏
  • 举报
回复
这是怎么回事?
握草 2018-04-12
  • 打赏
  • 举报
回复
而且奇怪的是,在f.close()关闭该别名和文件对象的关联后 >>> dir() 还是能看到f的存在。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧