cpython中列表元素的内存地址

2024-05-11 19:18:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我拿到4344.96万。但是当我这样做的时候: id(a[1]) id(a[2]) 分别生成1403048416和43489824,而不是预期的43449616(或一些倍数)和43449632(或一些倍数),假设内存指针使用相同的内存块!在

有人能解释一下我对间接寻址(或调用id())的理解有什么问题吗???在

谢谢!在


Tags: 数据内存字符串id元素列表整数数据类型
1条回答
网友
1楼 · 发布于 2024-05-11 19:18:10

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

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

看起来您希望id()为您提供列表中指针的地址,python不提供任何获取此地址的方法,但您可以根据需要确定它。在

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

当然,你不需要这些地址。通过查看结构定义in the cpython headers.,可以找到有关列表的更多详细信息

相关问题 更多 >