在Python中,字符串是通过引用还是通过值寻址的?

在Python中,字符串是通过引用还是通过值寻址的?,python,Python,如果我有一个python列表,可以说:['aaa','bbb']。这个列表是以2x8字节的形式存储的(对于64位寻址)-也就是说,我们只有指向列表中字符串的指针,还是存储在[len('aaa')+len('bbb')]*size_of_char-也就是说,我们有一个列表中每个字符串的字符的连续存储。访问python地址的方法是使用id() 进一步阅读。访问python地址的方法是使用id() 进一步阅读。在CPython的引擎盖下,所有内容都是指向的指针。子类型的结构字段中有一个指向PyObje

如果我有一个python列表,可以说:
['aaa','bbb']
。这个列表是以2x8字节的形式存储的(对于64位寻址)-也就是说,我们只有指向列表中字符串的指针,还是存储在
[len('aaa')+len('bbb')]*size_of_char
-也就是说,我们有一个列表中每个字符串的字符的连续存储。

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


进一步阅读。

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


进一步阅读。

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

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

指针序列实际上如下所示:

  • 指向列表对象的指针
  • 指向列表缓冲区的指针
  • 指向字符串对象的指针
  • 指向字符串数据的指针
  • 您可以从许多原因推断列表缓冲区不能有
    [len('aaa')+len('bbb')]*size\u的字符
    元素

  • Python中的所有内容都是一个对象,因此至少您需要为附加元数据留出空间
  • 列表可以容纳任何类型的对象,而不仅仅是固定长度的字符串。如何索引到元素大小不同的列表中
  • 在Unicode中,字符可以有不同的大小。字符串中的字节数与字符数没有直接关系。这让我们回到了1和2

  • 一般来说,如果您对CPython的内部工作方式感到好奇,请查看,以及CPython引擎盖下的。

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

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

    指针序列实际上如下所示:

  • 指向列表对象的指针
  • 指向列表缓冲区的指针
  • 指向字符串对象的指针
  • 指向字符串数据的指针
  • 您可以从许多原因推断列表缓冲区不能有
    [len('aaa')+len('bbb')]*size\u的字符
    元素

  • Python中的所有内容都是一个对象,因此至少您需要为附加元数据留出空间
  • 列表可以容纳任何类型的对象,而不仅仅是固定长度的字符串。如何索引到元素大小不同的列表中
  • 在Unicode中,字符可以有不同的大小。字符串中的字节数与字符数没有直接关系。这让我们回到了1和2

  • 一般来说,如果您对CPython的内部工作方式感到好奇,请查看和。

    使用id(lst)访问地址。是的,按价值计算。谢谢@Marcus.Aurelianus的链接!正如疯狂物理学家所提到的,我认为我们只有指向列表中字符串对象的指针。无论如何,您提到的id函数帮助我掌握了python方面我不知道的信息。我在对《疯狂物理学家》答案的评论中提到了其中一个。没问题,我也是一个新的学习者,只是想提供帮助。使用id(lst)访问地址。是的,按价值计算。谢谢@Marcus.Aurelianus的链接!正如疯狂物理学家所提到的,我认为我们只有指向列表中字符串对象的指针。无论如何,您提到的id函数帮助我掌握了python方面我不知道的信息。我在对疯狂物理学家回答的评论中提到了其中的一个。没问题,我也是一个新的学习者,只是想提供帮助。技术上是一个实现细节,但很好的推理@Mad Physician,谢谢先生。技术上是一个实现细节,但很好的推理@Mad Physician,谢谢先生。谢谢@Mad Physician,我刚刚理解了
    [1,2,'aa']
    l[2]的id(=地址)不一定大于
    l[1]的地址
    。事实上,这些不是列表缓冲区中单元格的地址,而是缓冲区单元格引用的元素的地址。@AyoubOm。您的理解似乎是正确的。如果您觉得您的问题已经得到了回答,您应该通过单击旁边的复选标记来选择答案。这会将其从未回答中删除感谢@Mad Physician,我刚刚理解了为什么在
    [1,2,'aa']
    l[2]
    的id(=地址)不一定大于
    l[1]的地址
    。事实上,这些不是列表缓冲区中单元格的地址,而是缓冲区单元格引用的元素的地址。@AyoubOm。您的理解似乎是正确的。如果您觉得您的问题已经得到了回答,您应该通过单击旁边的复选标记来选择答案。这会将其从未回答中删除排队并在四周分发积分。
    >>> a=['aaa', 'bbb']
    
    >>> id(a)
    62954056
    
    >>> id(a[0])
    62748912
    
    >>> id(a[1])
    61749544