Skip to main content
 首页 » 编程设计

python之混淆别名

2025年05月04日18jyk

我有以下按预期工作的代码:

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