这仅仅是由于 is 和 == 工作方式的不同, is 运算符不会比较值,它们只是检查两个操作数是否引用同一个对象。
例如,如果您这样做:
print(a is a)
输出将为: True
欲了解更多信息,请查看here https://dbader.org/blog/difference-between-is-and-equals-in-python
当 python 进行比较时,它会为操作数分配不同的位置,并且可以通过使用 id 函数的简单测试观察到相同的行为。
print(id(a[0]),a[0] is a[0],id(a[0]))
输出将是:
140296834593128 False 140296834593248
您另外提出的问题的答案是,为什么列表的行为与 numpy 数组的行为不同,这只是基于它们的构造。 Np.arrays 的设计目标是比普通的 Python 列表具有更高效的处理能力和更高效的存储能力。
因此,每次加载 numpy 数组或对 numpy 数组执行操作时,都会加载该数组并为其分配不同的 id,正如您可以从以下代码中观察到的那样:
a = np.array([0., 1., 2.,])
b = []
b.append(a[0])
print(id(a[0]),a[0] is b[0],id(b[0]))
以下是在 jupyter-lab 中多次重新运行相同代码的输出:
140296834595096 False 140296834594496
140296834595120 False 140296834594496
140296834595120 False 140296834594496
140296834595216 False 140296834594496
140296834595288 False 140296834594496
注意到一些奇怪的事情了吗?每次重新运行时 numpy 数组的 id 都不同,但列表对象的 id 保持不变。这解释了您问题中 numpy 数组的奇怪行为。
如果您想了解有关此行为的更多信息,我建议numpy 文档 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html