Python中未定义的行为
Python有什么未定义的行为?语言规范中未定义的含义。我所知道的唯一一个例子是在迭代过程中修改序列。在了解这一点之前,我曾经认为Python没有未定义的行为,因此我认为这是非常罕见的Python中未定义的行为,python,python-3.x,undefined-behavior,Python,Python 3.x,Undefined Behavior,Python有什么未定义的行为?语言规范中未定义的含义。我所知道的唯一一个例子是在迭代过程中修改序列。在了解这一点之前,我曾经认为Python没有未定义的行为,因此我认为这是非常罕见的 垃圾收集 Python 3.6中的有序词典 我认为垃圾收集属于这一类。主要的Python实现(例如)使用引用计数进行垃圾收集,但这不是语言规范所要求的 此外,在Python中的任何特定点上,都不能依赖于正在进行垃圾收集(并因此“清理”)的变量 考虑这一点: f=open(“file.txt”).read()
- 垃圾收集
- Python 3.6中的有序词典
我认为垃圾收集属于这一类。主要的Python实现(例如)使用引用计数进行垃圾收集,但这不是语言规范所要求的 此外,在Python中的任何特定点上,都不能依赖于正在进行垃圾收集(并因此“清理”)的变量 考虑这一点:
f=open(“file.txt”).read()
这在python新代码中非常常见,而且似乎足够安全,但对打开的文件对象没有显式的.close()
调用。当对象被销毁时,将隐式调用.close()
。由于CPython的工作方式,这几乎总是被及时地破坏,这在实践中是正常的。但对于其他python解释器来说,情况并非如此,最终可能会出现悬而未决的文件对象。这就是为什么你总是看到人们说这样做更安全
with open("file.txt") as fl:
f = fl.read()
因为现在对象的关闭不仅是显式的,而且保证在特定的代码行发生
在Python3.6中,字典的顺序与CPython中的实现细节相同。规范没有强制要求它,但人们开始依赖这种未定义的行为,这会给其他python解释器的用户带来问题,因此在python 3.7中,他们将有序字典作为规范的一部分。如何定义“未定义的”在您的上下文中?任何未在语言规范中明确定义的行为都是未定义的。请注意,在迭代过程中修改序列是完全可预测的。它的定义与否取决于序列迭代是否在规范中明确定义,我认为这不是很有趣。@juanpa.arrivillaga!你知道我想去哪里了解它的工作原理吗?我假设它是特定于实现的。@RedKnite对于内置序列,它基本上保留一个计数器,返回
self[I]
,然后递增I
,直到到达len(self)
。下面是对我给出Python实现的另一个问题的回答