gpt4 book ai didi

python - 为什么上下文会在 with 语句之后徘徊?

转载 作者:太空狗 更新时间:2023-10-29 20:36:48 26 4
gpt4 key购买 nike

我想知道为什么使用 with 打开文件对象语句或 block 中,退出后仍保留在范围内。是<closed file>曾经清理过的元素吗?

>>> with open('test.txt','w') as f:
... f.write('test')
...
>>> f
<closed file 'test.txt', mode 'w' at 0x00E014F0>
>>> f.close()


>>> if True:
... fal = open('demo.txt','w')
... fal.write('stuff')
... fal.close()
...
>>> fal
<closed file 'demo.txt', mode 'w' at 0x00E015A0>

最佳答案

在 Python 中,新作用域(又名命名空间)为模块、类和函数创建,而不是为任何其他语句创建,尤其不是为 with如果 block 。在 withfor 语句的主体内绑定(bind)的标识符因此绑定(bind)在最内层的周围范围内,这是您的情况下交互式解释器的顶级范围。只要此范围有效,标识符就会绑定(bind)在该范围内,或者直到它们被明确地从范围中删除(通过使用 del,如 del fal)。

对象只有在不再被引用时才能被清理。然而,这个对象真正被清理的实际时刻是不确定的。 Python 使用垃圾回收来进行内存管理,并且不强制执行特定策略。在使用引用计数的 CPython 中,一旦最后一个引用超出范围,就会立即清理对象。 PyPy 或 Jython 等替代实现使用更高级的垃圾收集器,它们可以在任意时间点清理未引用的对象。

这意味着,在您的示例中,绑定(bind)到 ffal 的对象基本上不会被清理,因为交互式解释器的顶级范围自然存在只要 interpeter 在运行。但是请注意,这实际上不是问题,因为它们仍然正确关闭并且不再要求任何文件资源,而只是一些内存。

关于python - 为什么上下文会在 with 语句之后徘徊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com