我读了“流畅的python”中的语句
标准库提供了C语言中实现的丰富的序列类型选择:
容器序列列表、元组和集合。deque可以保存不同类型的项。
平面序列str、bytes、bytearray、memoryview和array.array包含一种类型的项。
容器序列保存对它们包含的对象的引用,这些对象可以是任何类型的,而平面序列在物理上将每个项的值存储在它自己的内存空间中,而不是作为不同的对象。因此,平面序列更紧凑,但它们仅限于保存基本值,如字符、字节和数字。
容器序列包含对其包含的对象的引用,references
是否存在于物理状态中的指针或仅仅是一个虚构的概念来说明?
最佳答案
作为一个CPython实现细节,是的,它们实际上都是指向结构的C级指针,其中结构包含有关对象的信息(包括引用计数,因为CPython使用引用计数进行内存管理)。
因此,当您执行a = [1]
时,a
本身持有一个指向list
(准确地说是PyListObject
结构)的指针,它持有一个指向PyObject*
s数组(在PyListObject
字段中)的指针,其中存储的第一个元素是指向PyLongObject
的指针(扩展基PyObject
的结构,它对应于Python 3上Python层的int
类型)。同样,这也是所有实现细节,但是是的,您必须花费指针的内存来保存CPython中的每个这样的引用(除非您使用特别优化的C级容器,如array.array
、numpy
数组、bytes
/bytearray
/str
或ctypes
数组,这些容器通过保存特定类型,可以将它们存储为原始C数组,没有指向每个元素的对象的内部指针)。
在其他Python解释器中,在引擎盖下使用指针也可能是正确的,但是很容易会有更多的包装、抽象和间接层,以满足每个解释器使用的不同垃圾收集策略的需要。
关于python - 这些“引用”是否以物理状态或虚拟概念的指针形式存在?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52884365/