我有以下按预期工作的代码:
a = [1, 2, 3, 4]
b = a
>>> b is a
True
如果我稍微改变一下它仍然有效:
a = [1, 2, 3, 4]
b = a[2] * 2
>>> b is a[2] * 2
True
现在的问题:
a = [1, 2, 3, 4]
b = a * 2
>>> b is a * 2
False
谁能给我解释一下为什么这会返回 False,而 b is a[2] * 2 会返回 True?
请您参考如下方法:
当a 是一个列表时,a * 2 创建一个新的列表实例。如果调用 a * 2 两次,就会创建两个新的列表实例——这就是 b is a * 2 产生 False 的原因。
b is a[2] * 2 得到 True 的原因是缓存小整数的 CPython 优化。由于整数在 Python 中是不可变的,因此实际上获取新实例或缓存实例并不重要,对于小整数,如果再次命中相同的整数,Python 将返回缓存版本。也试试
>>> a = [1, 2, 300, 4]
>>> b = a[2] * 2
>>> b is a[2] * 2
False
