cpython中列表元素的内存地址

时间:2016-06-28 05:29:57

标签: python list cpython indirection

我听说Python使用间接来实现列表。也就是说,Python列表中的每个元素实际上是指向内存中存储实际元素数据(可以是整数,字符串或任何其他数据类型)的位置的指针或引用。所以当我使用

创建一个列表时
    a = ["xyz",2,"deer"]
    id(a[0])

我得到43449600.但是当我这样做时:         ID(一个[1])         ID(一个[2]) 分别产生1403048416和43489824,而不是预期的43449616(或一些倍数)和43449632(或一些倍数),假设内存指针使用相同的内存块!

有人可以解释我对间接(或调用id())???

的理解有什么问题

谢谢!

1 个答案:

答案 0 :(得分:1)

当你使用id()时,你将对象拉出数组并获取对象的地址。您可以在以下示例中看到字符串“xyz”具有相同的地址,无论它是在数组中还是存储在变量中:

>>> a = ["xyz",2,"deer"]
>>> id(a[0])
43449600
>>> b = a[0]
>>> id(b)
43449600

看起来你期望id()为你提供列表中指针的地址,python没有提供任何获取此地址的方法,但你可以根据需要找出它。

  1. 首先,您需要执行id(a),这将为您提供列表数据结构的位置,我将以4346000为例。
  2. 列表数据结构包含一些标准的python簿记字段,后跟你感兴趣的指针数组.bookeeping字段的大小取决于你的系统和python构建,但是假设它是24字节。
  3. 如果您查看地址43460024的簿记,您会发现第一个指向43449600的指针
  4. 假设8字节指针,下一个元素是43460032并包含指针1403048416
  5. 最后的43460040你会找到43489824。
  6. 当然,没有充分的理由需要这些地址。您可以通过查看结构定义in the cpython headers.

    找到有关列表的更多详细信息