Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,“list”的内存分配是如何工作的?为什么列表的大小和对象的总和不同?_Python_Python 3.x_Data Structures_Memory Management - Fatal编程技术网

在Python中,“list”的内存分配是如何工作的?为什么列表的大小和对象的总和不同?

在Python中,“list”的内存分配是如何工作的?为什么列表的大小和对象的总和不同?,python,python-3.x,data-structures,memory-management,Python,Python 3.x,Data Structures,Memory Management,我有下面的程序来打印列表及其元素的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]))

我有下面的程序来打印列表及其元素的
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
几个问题:

  • [0]的大小为28。当我乘以28*3=84时,列表a的大小是88
  • 当我减去a[1]-a[0]的地址时,即10914528-10914496=32 当我使用函数的大小时,我是如何得到28的
  • a
    id
    是139954746492104。那么
    a[0]
    id
    是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字节


      回答您的问题:

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

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

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

      a[1]
      a[0]
      指的是两个独立的对象,它们的内存分配不保证会传染

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


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

      如果[0]、a[1]和a[2]不能保证是一致的,那么a应该存储a[0]或a[1]或a[2]的地址,或者a应该只存储[0]的地址?