Python列表元素存储位置与__getitem__获取元素来源技术咨询
Python列表元素的存储位置与__getitem__的工作原理
这个问题其实戳中了Python里自定义类实例和内置序列类型的底层实现差异,我来给你掰扯清楚:
1. 自定义对象 vs 列表:存储逻辑的本质不同
你举的myObj实例例子里,自定义类的对象默认会用一个**实例字典(__dict__)**来存自身的属性(比如a、b、c),所以vars(a)本质就是返回这个__dict__,能直接看到所有属性的键值对。
但列表是Python的内置可变序列类型,为了追求极致性能,它并没有采用字典这种相对笨重的存储方式。底层是用C语言实现的动态数组来存元素的,这种结构比字典更省内存、访问速度更快。正因为列表实例根本没有__dict__属性,所以调用vars([])会直接报错——它压根没什么字典可返回的。
2. __getitem__从哪拿列表元素?
当你用list[index]或者直接调用list.__getitem__(index)时,这个方法并没有去什么字典里找元素,而是直接和底层的C实现交互:
- 先检查索引是否合法(比如有没有越界);
- 合法的话,直接从底层的动态数组里根据索引位置取出对应的元素。
这也是为什么dir([1,2,3])只能看到列表类的方法——列表的元素属于序列的“内容”,并不是对象的“属性”,自然不会出现在dir()返回的属性/方法列表里。
内容的提问来源于stack exchange,提问作者Primusa
相关产品推荐
相关产品推荐

