列表值位于类对象中的什么位置?
如果列表对象是Python中的
class
:
>>> a = ['one', 'two']
>>> type(a)
<class 'list'>
所以它存储在类中的某个地方,但是在哪里?
例如:
如果我们定义一个带有值的类:
class Test:
def __init__(self):
self.test_name = "Do Not"
self.test_surname = "Know"
很容易找到实例值:
>>> b = Test()
>>> print(b.__dict__)
{'test_surname': 'Know', 'test_name': 'Do not'}
是否有类似的选项可以达到列表类对象中的这些值?
您不会在幕后的某处找到项目的字典,如此处的类
Test
属性所示,因为这不是列表的实现方式。相反,C 结构本身是一个数组,存储其长度和项目的内存位置(src)。
在 CPython 中,列表容器对象仅保存指向存储值的指针。涉及列表内部的操作仅操作这些指针,而不操作对象。
(图片来源:这里)
内存被过度分配,因此总是有一些可用的空闲插槽,这使得追加和插入速度更快。满时分配的空间增加约 12.5%。实际上,您可以通过附加到列表并循环调用
sys.getsizeof
来看到这一点:
>>> import sys
>>> l = []
>>> for i in range(100):
... print(sys.getsizeof(l)),
... l.append(None)
...
72 104 104 104 104 136 136 136 136 200 200 200 200 200 200 200 200 272 272 272 272 272 272 272 272 272 352 352 352 352 352 352 352 352 352 352 440 440 440 440 440 440 440 440 440 440 440 536 536 536 536 536 536 536 536 536 536 536 536 648 648 648 648 648 648 648 648 648 648 648 648 648 648 776 776 776 776 776 776 776 776 776 776 776 776 776 776 776 776 920 920 920 920 920 920 920 920 920 920 920
我们必须拒绝前提:
所以它存储在类中的某个地方,但是在哪里?
列表引用的对象存在于列表本身的外部。相反,您可以将列表视为对其他 Python 对象的引用的数组,并且它们在列表中的成员身份只会增加对象的引用计数。
其实不然。列表项不存储在列表对象的任何可访问属性下。这只是该语言的低级实现细节。
但是,如果您想对
list
进行子类化并添加或删除项目,则只需在 self
上运行列表操作即可。
In [67]: class TestList(list):
....: def __init__(self, defaultElement):
....: self.append(defaultElement)
....:
In [68]: TestList('sample')
Out[68]: ['sample']
...
In [72]: TestList('sample') + ['3']
Out[72]: ['sample', '3']
另请注意,
dict()
本身没有__dict__
,或者:
In [73]: dict().__dict__
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-73-58263694ff9c> in <module>()
----> 1 dict().__dict__
AttributeError: 'dict' object has no attribute '__dict__'
您可以在 CPython 的
list()
中找到 Objects/listobject.c
here的源实现。
是否有类似的选项可以达到列表类对象中的这些值?
是的。这是列表本身。例如,如果您定义
a
:
a = ['one', 'two']
然后列表值位于
a
。