【问题标题】:Memory address of list elements in cpythoncpython中列表元素的内存地址
【发布时间】:2016-10-30 06:45:02
【问题描述】:

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

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

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

有人可以解释我对间接(或调用 id())的理解有什么问题吗???

谢谢!

【问题讨论】:

  • 如果存储的是指向元素的指针而不是元素,它们可以指向任何地方。如果您存储了元素,那么您将获得连续的地址。

标签: python list cpython indirection


【解决方案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 簿记字段,后跟您感兴趣的指针数组。簿记字段的大小取决于您的系统和 Python 版本,但假设为 24 字节。
  3. 如果您查看地址 43460024 的簿记,您会发现您的第一个指针指向 43449600
  4. 假设 8 字节指针,下一个元素位于 43460032 并包含指针 1403048416
  5. 最后一个是 43460040,您会找到 43489824。

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

【讨论】:

  • 有道理!谢谢!
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多