首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表大小

Python列表大小
EN

Stack Overflow用户
提问于 2018-07-25 06:02:19
回答 2查看 1.4K关注 0票数 2

我只是在检查Python 3中某些数据类型的大小,并观察到了这一点。

代码语言:javascript
复制
import sys

val = None
print(sys.getsizeof(val))

输出结果与预期的一样为16

我试着列出了None的1000个位置,我希望它的大小是16*1000 = 16000或更多。但我得到的结果不一样。

代码语言:javascript
复制
import sys

val = [None]*1000

print(sys.getsizeof(val))

输出为8064。差不多是我预期的一半大小。

这是什么原因?为什么分配的内存较少?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-25 06:08:38

代码语言:javascript
复制
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

注意:任何字节都不能因环境而异。

票数 6
EN

Stack Overflow用户

发布于 2018-07-25 06:05:33

只有一个None对象被引用了上千次。所以情况是:

代码语言:javascript
复制
l[0]   ----> None
         /    ^
l[1]   -/     |
….            |
l[999]  -----/

而不是这个:

代码语言:javascript
复制
l[0]   ----> None

l[1]   ----> None
….
l[999] ----> None

在重复可变对象时,这一点更明显,如下所示:

代码语言:javascript
复制
>>> 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数据结构(如listsetdict )是基于引用的。在您的示例中,您观察到的8064字节中的大部分来自对象引用(每个列表元素8个字节)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51511802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档