我只是在检查Python 3中某些数据类型的大小,并观察到了这一点。
import sys
val = None
print(sys.getsizeof(val))输出结果与预期的一样为16。
我试着列出了None的1000个位置,我希望它的大小是16*1000 = 16000或更多。但我得到的结果不一样。
import sys
val = [None]*1000
print(sys.getsizeof(val))输出为8064。差不多是我预期的一半大小。
这是什么原因?为什么分配的内存较少?
发布于 2018-07-25 06:08:38
import sys
val = None
print(sys.getsizeof(val))
Answer:
16
val = []
print(sys.getsizeof(val))
Answer:
72
val = [None]
print(sys.getsizeof(val))
Answer:
80
so [None]*1000 = 1000* 8 + 72 = 8072注意:任何字节都不能因环境而异。
发布于 2018-07-25 06:05:33
只有一个None对象被引用了上千次。所以情况是:
l[0] ----> None
/ ^
l[1] -/ |
…. |
l[999] -----/而不是这个:
l[0] ----> None
l[1] ----> None
….
l[999] ----> None在重复可变对象时,这一点更明显,如下所示:
>>> l = [set()] * 3
>>> print(l)
[set(), set(), set()]
>>> l[0].add(1)
>>> print(l)
[{1}, {1}, {1}]只有一个共享的set对象被引用了三次,所以对l[0]的设置的更改也会影响l[1]和l[2]。
Python数据结构(如list、set和dict )是基于引用的。在您的示例中,您观察到的8064字节中的大部分来自对象引用(每个列表元素8个字节)。
https://stackoverflow.com/questions/51511802
复制相似问题