字符串是否在Python中通过引用或值来寻址?

时间:2018-07-13 03:33:37

标签: python

如果我有python列表,请说:['aaa', 'bbb']。此列表是以2x8字节存储的(用于64位寻址)-即我们在列表中仅具有指向字符串的指针,还是存储在[len('aaa')+len('bbb')]*size_of_char中-即我们在其中连续存储了每个字符串的字符列表。

2 个答案:

答案 0 :(得分:3)

访问python地址的一种方法是使用id()。

>>> a=['aaa', 'bbb']

>>> id(a)
62954056

>>> id(a[0])
62748912

>>> id(a[1])
61749544

进一步的阅读是here [understanding-python-variables and memory management]

答案 1 :(得分:2)

在CPython中,所有内容都是指向PyObject的指针。子类型PyListObject的结构字段中有一个指向PyObjects的指针数组的指针。

字符串也是PyObject的子类型,通常在PyUnicodeObject中实现。类似于列表,字符串包含指向包含其元素的缓冲区的指针。

所以指针的顺序实际上是这样的:

  1. 指向对象的指针
  2. 指向列表缓冲区的指针
  3. 指向字符串对象的指针
  4. 指向字符串数据的指针

您可以从多种原因推断出列表缓冲区中不能包含[len('aaa') + len('bbb')] * size_of_char个元素的事实。

    Python中的
  1. 一切是一个对象,因此至少您需要有空间容纳其他元数据。
  2. 列表可以保存任何类型的对象,而不仅仅是固定长度的字符串。您如何索引元素大小不同的列表?
  3. 字符的Unicode大小可以不同。字符串中的字节数和字符数不直接相关。这使我们回到了#1和#2。

通常,如果您对CPython的内部运行方式感到好奇,请查看API docssource code