gpt4 book ai didi

python - 什么时候在python中释放函数堆栈数据?

转载 作者:太空狗 更新时间:2023-10-30 01:23:39 25 4
gpt4 key购买 nike

我有一个关于测试以下代码的问题:

1,

def file_close_test():
f = open('/tmp/test', 'w+')

if __name__ == '__main__':
file_close_test()
# wait to see whether file closed.
import time
time.sleep(30)

2,

def file_close_on_exc_test():
f = open('/tmp/test', 'w+')
raise Exception()

def exception_wrapper():
try:
file_close_on_exc_test()
except:
pass
# wait to see whether file closed.
import time
time.sleep(10)

if __name__ == '__main__':
exception_wrapper()
import time
time.sleep(30)
  1. 文件对象在 file_close_test 退出时关闭,因为没有引用它。
  2. 抛出异常后,文件对象没有关闭。所以我认为相关的堆栈数据没有释放。
  3. exception_wrapper退出后,文件自动关闭。

你能为我解释一下吗?谢谢。

最佳答案

异常包含一个回溯对象,可用于访问抛出异常时处于事件状态的任何堆栈帧中的所有局部变量。这意味着您仍然可以访问该文件,直到异常上下文被清除。

即使在 exception_wrapper 末尾的 sleep() 之后,您也可以像这样使用 sys.exc_info 获取打开的文件:

tb = sys.exc_info()[2]
print tb.tb_next.tb_frame.f_locals['f']

当然,所有这些都是特定于您正在使用的特定 Python 实现的。其他实现可能根本不会隐式关闭文件,直到它们被垃圾收集。

最重要的是,您永远不应该依赖 Python 的引用计数或垃圾收集来清理打开文件等资源,始终明确地这样做。

关于python - 什么时候在python中释放函数堆栈数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797562/

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