微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`list` 的内存分配如何在 Python 中工作?为什么列表的大小与其对象的总和不同?

如何解决`list` 的内存分配如何在 Python 中工作?为什么列表的大小与其对象的总和不同?

我有以下程序来打印列表的 id 和大小及其元素。

import sys

a=[1,2,3]

print(id(a))
print(id(a[0]))
print(id(a[1]))
print(id(a[2]))

print("=================")

print(sys.getsizeof(a))
print(sys.getsizeof(a[0]))
print(sys.getsizeof(a[1]))
print(sys.getsizeof(a[2]))

打印:

139954746492104
10914496
10914528
10914560
=================
88
28
28
28

几个问题

  • a[0] 的大小是 28。当我乘以 28*3=84 时,列表 a 的大小是 88?
  • 当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32 使用函数大小时如何得到 28?
  • ida 是 139954746492104。那么 ida[0] 是 10914496 吗?

解决方法

python 中的列表不包含对象本身。它们只是存储对对象的引用。 因此,任何索引处的对象大小都与列表的大小不成正比。例如:

>>> import sys
>>> my_list = [10,"my_str",{}]


>>> sys.getsizeof(my_list[0])  # it is memory used by int
24
>>> sys.getsizeof(my_list[1])  # it is memory used by str
43
>>> sys.getsizeof(my_list[2])  # it is memory used by dict
280

>>> sys.getsizeof(my_list)  # and it is memory used by your list object itself
96

此处,my_list 的大小为 96 字节,而仅 my_list[2] 的大小为 280 字节。


回答您的问题:

a[0] 的大小是 28。当我乘以 28*3=84 时,列表 a 的大小是 88?

正如我上面提到的,list 只保存对对象的引用,而不是对象本身。因此,列表使用的内存和它的每个对象使用的内存不会相同。

当我减去 a[1] - a[0] 的地址时,即 10914528 -10914496 = 32 当我使用函数大小时我如何得到 28?

a[1]a[0] 引用两个独立的对象,它们的内存分配不保证具有传染性。

a 的 id 是 139954746492104。那么 a[0] 的 id 是 10914496?

同上。因为两者都显示两个独立的对象。

,

没有任何元素的列表本身已经有一定的大小,而不仅仅是值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。