在Python中,字符串是通过引用还是通过值寻址的?
如果我有一个python列表,可以说:在Python中,字符串是通过引用还是通过值寻址的?,python,Python,如果我有一个python列表,可以说:['aaa','bbb']。这个列表是以2x8字节的形式存储的(对于64位寻址)-也就是说,我们只有指向列表中字符串的指针,还是存储在[len('aaa')+len('bbb')]*size_of_char-也就是说,我们有一个列表中每个字符串的字符的连续存储。访问python地址的方法是使用id() 进一步阅读。访问python地址的方法是使用id() 进一步阅读。在CPython的引擎盖下,所有内容都是指向的指针。子类型的结构字段中有一个指向PyObje
['aaa','bbb']
。这个列表是以2x8字节的形式存储的(对于64位寻址)-也就是说,我们只有指向列表中字符串的指针,还是存储在[len('aaa')+len('bbb')]*size_of_char
-也就是说,我们有一个列表中每个字符串的字符的连续存储。访问python地址的方法是使用id()
进一步阅读。访问python地址的方法是使用id()
进一步阅读。在CPython的引擎盖下,所有内容都是指向的指针。子类型的结构字段中有一个指向
PyObjects
指针数组的指针
字符串也是PyObject
的一个子类型,通常在中实现。与列表类似,字符串包含指向包含其元素的缓冲区的指针
指针序列实际上如下所示:
[len('aaa')+len('bbb')]*size\u的字符
元素
一般来说,如果您对CPython的内部工作方式感到好奇,请查看,以及CPython引擎盖下的。,所有内容都是指向的指针。子类型的结构字段中有一个指向
PyObjects
指针数组的指针
字符串也是PyObject
的一个子类型,通常在中实现。与列表类似,字符串包含指向包含其元素的缓冲区的指针
指针序列实际上如下所示:
[len('aaa')+len('bbb')]*size\u的字符
元素
一般来说,如果您对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