Python 中未定义的行为

Red*_*ite 5 python undefined-behavior python-3.x

Python 有哪些未定义的行为?语言规范中未定义的含义。我知道的唯一例子是在迭代序列时修改序列。在了解这一点之前,我曾经认为 Python 没有未定义的行为,所以我认为这是极其罕见的。

Set*_*ton 5

这里有两个:

  • 垃圾收集
  • Python 3.6 中的有序字典

我认为垃圾收集属于这一类。主要的 Python 实现(例如CPython)使用引用计数进行垃圾收集,但这不是语言规范所强制的。

此外,您不能依赖在 Python 中的任何特定点对变量进行垃圾收集(并因此“清理”)。

考虑一下:

f = open("file.txt").read()
Run Code Online (Sandbox Code Playgroud)

这在 python 新手代码中很常见,并且看起来足够安全,但没有.close()对打开的文件对象进行显式调用。当对象被销毁时,.close()被隐式调用。由于 CPython 的工作方式,它几乎总是会及时被销毁,并且在实践中最终是可以的。但对于其他 python 解释器来说,情况并非如此,您最终可能会得到悬空的文件对象。这就是为什么你总是看到人们说这样做更安全

with open("file.txt") as fl:
   f = fl.read()
Run Code Online (Sandbox Code Playgroud)

因为现在对象的关闭不仅是显式的,而且保证发生在特定的代码行。


在 Python 3.6 中,字典按照 CPython 中的实现细节进行排序。规范没有强制要求,但人们开始依赖这种未定义的行为,这会给其他 python 解释器的用户带来问题,因此在 Python 3.7 中,他们将有序字典作为规范的一部分。