Python中赋值给其他模块的文件对象,原模块关闭后是否也会被正常关闭?
Python中赋值给其他模块的文件对象,原模块关闭后是否也会被正常关闭?
这个问题其实要从Python的对象引用逻辑说起,搞懂底层逻辑你就完全明白啦~
先给你明确结论:是的,主模块里关闭file_obj后,其他模块中被赋值的file_obj引用指向的其实是同一个文件对象,也会被正常关闭。
具体给你拆解下:
Python里的所有变量(不管是模块全局变量还是局部变量),本质上都是对内存中实际对象的"引用指针"。你在main_file.py里执行im.file_obj = file_obj,并不是复制出一个全新的文件对象,只是让imported_module里的file_obj变量,也指向了内存中那个已经打开的同一个文件对象。
结合你的代码场景来看:
- 当你在
main_file.py调用file_obj.close()时,你是在操作这个唯一的底层文件对象,调用它的关闭方法。不管有多少个模块里的变量(比如im.file_obj,甚至多层导入后imported_module0里的file_obj)引用它,这个对象本身已经处于关闭状态了。 - 要是你之后再尝试用
im.file_obj.write()或者其他模块的引用去操作文件,会直接抛出ValueError: I/O operation on closed file的错误,这也能侧面证明对象确实已经被关闭。
哪怕是你担心的多层导入场景——比如imported_module再把这个文件对象赋值给imported_module0的file_obj,本质上还是传递同一个引用。主模块关闭后,所有这些变量指向的都是那个已经关闭的文件对象,完全不需要逐个模块去手动调用关闭。
最后给你提个更稳妥的实践建议:
与其手动管理文件关闭的细节,不如用Python的with上下文管理器来处理文件。它会在代码块结束后自动帮你关闭文件,不管中间有没有异常,从根源上避免这类手动管理的麻烦。比如把你的主模块代码改成这样:
import imported_module as im def main(): a = 5 b = 7 im.add_func(a, b) im.multiply_func(a, b) def add_func(x, y): z = x + y im.file_obj.write(str(z) + '\n') with open('text_file.txt', mode='w') as file_obj: im.file_obj = file_obj main() # with块结束后文件自动关闭,所有引用该对象的模块变量都会指向关闭后的对象
内容来源于stack exchange
相关产品推荐
相关产品推荐

