我最近遇到了这个问题:
sys.getsizeof([0] * 3) # 80
sys.getsizeof([0, 0, 0]) # 120
sys.getsizeof([0 for i in range(3)]) # 88
检查过
Python 3.10.4。需要澄清的是,这种行为并不是所有版本的 Python 的特征,而只是大约3.9.19到3.10.14(但这并不精确)。
真正的问题是这里发生了什么以及为什么相同的列表权重不同?
import sys
list_1 = [0] * 3
list_2 = [0, 0, 0]
list_3 = [0 for i in range(3)]
print(list_1) # > [0, 0, 0]
print(list_2) # > [0, 0, 0]
print(list_3) # > [0, 0, 0]
print(list_1 == list_2 and list_2 == list_3 and list_3 == list_1) # > True
print(sys.getsizeof(list_1)) # > 80
print(sys.getsizeof(list_2)) # > 120
print(sys.getsizeof(list_3)) # > 88
假设第一个数组在复制后在内存中存储对同一对象的三个引用是合乎逻辑的,并且解释器以某种方式对此进行了优化。但其他数组不也会发生同样的情况吗?毕竟,Python 缓存的是从 -5 到 256 的数字,这意味着对缓存的数字 0 的三个相同引用应该存储在其他列表中。但是,问题来了:为什么对相同数字的三个引用与三个相同。引用不同的数字?同时小于列表 2 和 3 中的数字?
list_4 = list(range(3))
print(list_4) # > [0, 1, 2]
print(sys.getsizeof(list_4)) # > 80
