从函数返回后文件会关闭吗?

Posted

技术标签:

【中文标题】从函数返回后文件会关闭吗?【英文标题】:Will the file be closed after returning from function? 【发布时间】:2016-09-07 01:08:15 【问题描述】:

这是一个python函数:

def read_data(filename):
    f = zipfile.ZipFile(filename)
    for name in f.namelist():
        return tf.compat.as_str(f.read(name))
    f.close()

文件会被关闭吗?调用没有错误。

【问题讨论】:

我不太了解这里的缩进,您可能会遇到语法错误或对程序的意外解释。为什么for 语句相对于前面的变量声明缩进? 另外,如果你修复缩进,答案是否定的,文件不会被关闭。您应该在此处使用with 子句,以便在您离开范围后自动释放文件句柄。 您的代码也不会像第一次迭代中的return 那样遍历namelist...如果您正在寻找更多此函数的一个结果。 @AsadSaeeduddin 我很确定python在返回后不会执行打印方法,但不相信关闭文件。 @C.Zion Python 不会在返回后执行任何操作,对于名为 close 的方法没有特别的限制。 【参考方案1】:

文件不会被关闭。如果要关闭文件,可以这样写:

def read_data(filename):
    with zipfile.ZipFile(filename) as f:
        for name in f.namelist():
            return tf.compat.as_str(f.read(name))

测试您的代码:

使用with 测试代码:

【讨论】:

从技术上讲,在 CPython 中,close 在释放对类文件对象的最后一个引用时隐式发生(例如,如果没有存储其他引用,则在函数返回时),但这是 CPython 引用的产物计数(并且它可能会被一些简单的事情暂时挫败,比如在回溯框架中保留本地人的异常);您应该始终尽可能使用with 块以获得可预测的关闭行为,因此不会被遗忘或意外跳过。 @wolframalpha 谢谢!

以上是关于从函数返回后文件会关闭吗?的主要内容,如果未能解决你的问题,请参考以下文章

channel关闭后立即返回false吗

递归 bash 函数在下降后会失去返回的能力吗?

从循环内部返回是一种好习惯[关闭]

从动作返回文件时,流会被释放吗? [复制]

音频文件到文本的转换[关闭]

我可以访问从 Delphi CreateProcess 命令返回的字符串吗?