显然list(a)
不会整体化,[x for x in a]
在某些点上整体化,而[*a]
整体化一直”>?]]
这里是从0到12的大小n,三种方法的结果大小以字节为单位:
0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 120 120 152 9 128 184 184 10 136 184 192 11 144 184 200 12 152 184 208
使用Python 3这样计算,reproducable at repl.it,8
:
from sys import getsizeof for n in range(13): a = [None] * n print(n, getsizeof(list(a)), getsizeof([x for x in a]), getsizeof([*a]))
所以:这是如何工作的?
[*a]
如何整体化?实际上,它使用什么机制从给定的输入创建结果列表?它是否在a
上使用了迭代器,并使用了list.append
之类的东西?源代码在哪里?
((产生图像的Colab with data and code。]
放大到较小的n:
放大到较大的n:
显然,list(a)不会汇总,[a中的x表示x]在某些点上累计,而[* a]一直都汇总?这是从0到12的大小n,三个字节的结果大小(以字节为单位)...
[[*a]
正在内部执行:
list
这些将是CPython解释器的实现细节,因此在其他解释器之间可能不一致。