在python中打开文件时,一旦将变量分配给文件,当重新分配变量时,文件会发生什么变化?

在python中打开文件时,一旦将变量分配给文件,当重新分配变量时,文件会发生什么变化?,python,file,variables,Python,File,Variables,如果我将一个变量分配给一个文件(打开文件时),然后将该变量重新分配给其他对象,那么该文件会发生什么情况?它会自动关闭还是会使我的IDE崩溃 File = open("File.txt", 'w') File = "File" 文件会发生什么情况?从技术上讲,“变量”一词在Python中用词不当。在Python中,一切都是一个对象—当您分配一个“变量”时,您真正分配的是在=符号后引用回对象的名称 在您的例子中,File是对open(“File.txt”,“w”)创建的对象的名称引用。您告诉Pyt

如果我将一个变量分配给一个文件(打开文件时),然后将该变量重新分配给其他对象,那么该文件会发生什么情况?它会自动关闭还是会使我的IDE崩溃

File = open("File.txt", 'w')
File = "File"
文件会发生什么情况?

从技术上讲,“变量”一词在Python中用词不当。在Python中,一切都是一个对象—当您分配一个“变量”时,您真正分配的是在
=
符号后引用回对象的名称

在您的例子中,
File
是对
open(“File.txt”,“w”)
创建的对象的名称引用。您告诉Python解释器,无论何时在代码中引用
文件
,都希望访问锁定在写模式下的文件对象。然后,当您将名称
File
重新分配给文本字符串
“File”
时,您只是告诉Python解释器,当您引用
File
时,您是在寻找
“File”
,而不是创建的File对象

由于您已重新分配了对象引用,但没有保留对原始对象的引用,因此该对象不再可访问,并且最终可能会被垃圾收集器收集,并在解释器认为它需要更多资源且不再需要该对象时被处置


但是,在这种情况下,文件对象更有可能在写入模式下锁定并保持打开状态,直到脚本完全终止,最后留下一个空白文件。

您尝试过吗?发生了什么事?@Chris弄清楚这个案子发生了什么几乎是微不足道的。这取决于特定的python解释器、文件对象被引用的次数、garbag collection何时运行等。所有这些都是“只是运行它”并查看发生的情况所无法看到的。您是否询问文件系统中的文件会发生什么情况,或者关于Python解释器中的对象会发生什么情况?我在问作为对象的文件会发生什么情况。python会立即关闭/丢弃它,还是保持打开状态,使程序稍微慢一点@克里斯:我无法通过运行它来判断文件发生了什么。请注意:假设解释器确实依赖垃圾收集器进行清理(例如,CPython不依赖,而是依赖引用计数),除非某些非常特定的条件适用,python进程在终止之前要做的最后一件事是垃圾收集所有内容。这意味着,文件最后不会为空。不过,OP应该在完成写入时关闭文件(或者,更好的是,使用上下文管理器)@GPhilo这意味着,文件结尾不会是空的。-根据我的经验,至少在Vanilla Python中,文件是在
open(…)
处立即创建的,并在发布之前用写访问锁定。i、 当脚本终止时。该文件不会被删除。因此,我不确定是否有这样一种情况,即文件最后不会是空的-如果你观察到这种情况,我也希望得到启发。不,你说得对-对于这段代码-文件是空的,因为没有写入它。在写我之前的评论时,我想到的是“内容何时实际写入磁盘?”加上一个可能的“如果不关闭文件,可能会丢失写入的数据”(虽然你从未说过可能会发生这种情况,但我的缺点是误解了答案)。我能想到的测试这种行为的最好方法是打开一个文件,向其中写入一些大数据(测试速度为150MBs),立即将名称重新分配给一个字符串,如OP的问题中所述,然后让程序在不关闭文件的情况下终止。这导致数据被正确写入并刷新到磁盘(至少在CPython 3.7/Ubuntu 18.04上),这与引用计数达到零时CPython的删除行为一致。使用
w
wb
进行测试,相同的结果不使用CPython,因此了解它的行为有多不同很有趣。谢谢你用这种思路娱乐,学到了一些新东西。