cpython中列表元素的内存地址



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

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

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

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

谢谢!

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

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

看起来你希望id()给你列表中指针的地址,python没有提供任何方法来获取这个地址,但是如果你想的话,你可以找出它。

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

当然,你没有理由需要这些地址。您可以通过查看cpython头文件中的结构定义来查找关于列表的更多详细信息。

最新更新