为什么 Online Python Tutor 将这个不可变整数以图形方式呈现为两个不同的整数?

Why does Online Python Tutor present this immutable integer as two different integers graphically?

在 Fluent Python 中,作者 Luciano Ramalho,第 8 章,默认情况下副本很浅,有一个示例:

>>> listOne = [3, [55, 44], (7, 8, 9)]
>>> listTwo = list(listOne)
>>> listTwo
[3, [55, 44], (7, 8, 9)]
>>> listTwo == listOne
True
>>> listTwo is listOne
False

作者建议我们应该运行使用Online Python Tutor 来通过这段代码一步一步地看到底发生了什么。

我使用 Online Python Tutor 执行了前两行,这是我得到的屏幕截图:

让我困惑的是:

每个列表中的所有三个元素,不可变整数,列表和元组实际上是相同的,例如

listOne[0] is listTwo[0] #True
listOne[1] is listTwo[1] #True
listOne[2] is listTwo[2] #True

那么为什么图表在各自列表的开头显示两个单独的 3?

这里是CPythonoptimization。这可能不会出现在其他 Python 实现中。

x = 256
x is 256 # True
x = 257
x is 257 # False

OnlinePythonTutor 的开发人员做出了这个决定,记录在 Unsupported features 下,因为这不是保证的语言功能,而是特定于实现的:

Python

for strings and numbers, you can't rely on the behaviors of id() or is matching CPython on your computer; when teaching beginners, you shouldn't rely on these behaviors since they are implementation-specific optimizations. for details, see GitHub issues here and here and here

您可以从 issue 255 中看出整数的行为过去是不同的,即使在 -5 到 256 范围之外也是如此。