Python有什么未定义的行为?未定义的含义不在语言规范中。我知道的唯一示例是在遍历序列时修改序列。在了解这一点之前,我曾经认为Python没有未定义的行为,因此我认为它非常罕见。
我会认为垃圾收集属于这一类。 Python的主要实现(例如CPython)使用引用计数进行垃圾回收,但这不是语言规范所要求的。
此外,您不能依赖于在Python中的任何特定点对变量进行垃圾回收(并因此“清理”)。
考虑此:
f = open("file.txt").read()
这在新的python代码中很常见,并且看起来足够安全,但是在打开的文件对象上没有显式的.close()
调用。销毁对象时,将隐式调用.close()
。由于CPython的工作方式,几乎总是及时将其销毁,最终在实践中还可以。但是对于其他python解释器,情况并非如此,最终可能会导致文件对象悬空。这就是为什么您总是看到人们说这样做更安全的原因
with open("file.txt") as fl:
f = fl.read()
因为现在对象的关闭不仅是显式的,而且可以保证在特定的代码行发生。
该语言不允许的内容基本上是未定义的,例如迭代一个int for i in 34
或使用一个可迭代的list(34)
转换一个整数,将1参数传递给某个函数,例如map(a)
。列表继续