3

在 Fluent Python 中,作者 Luciano Ramalho,第 8 章,Copies Are Shallow by Default,有一个例子:

>>> 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 呢?

4

2 回答 2

3

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

Python

对于字符串和数字,您不能依赖 计算机上 CPython的行为id()或匹配;is在教授初学者时,您不应该依赖这些行为,因为它们是特定于实现的优化。有关详细信息,请参阅此处、此处和此处的 GitHub 问题

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

于 2019-10-15T09:01:13.000 回答
-3

这是 CPython优化。这可能不在其他 Python 实现中。

x = 256
x is 256 # True
x = 257
x is 257 # False
于 2019-10-15T08:31:24.853 回答