Python中使用[]创建列表时调用的底层函数是什么
Python中
[]创建列表的底层调用逻辑 首先要区分两种完全不同的[]语法场景,二者底层逻辑没有关联:
- 作为索引/切片运算符使用的
[]:比如a[0]、a[1:3],属于可重载的运算符,会根据操作对象的类型,对应调用类中定义的__getitem__(读)、__setitem__(写)、__delitem__(删)特殊方法,这个流程允许用户在自定义类中重写拦截。 - 作为列表字面量使用的
[]:比如[]、[1,2,"a"],属于Python解释器原生支持的字面量语法,没有对应的可重载特殊方法,不会走用户可自定义拦截的调用流程:- 解释器编译代码时,会把列表字面量编译成
BUILD_LIST字节码指令,执行这条指令时会直接在C层面创建内置list类型的实例,填充初始元素,整个过程是解释器内部实现,不存在类似__getitem__那样可以被重写的钩子函数。 - 这种写法最终生成的对象和调用
list()构造方法得到的列表实例完全一致,但字面量写法执行效率更高,因为跳过了Python层面的构造方法调用解析流程。
- 解释器编译代码时,会把列表字面量编译成
你可以用一段简单的代码验证这个逻辑:
class CustomList(list): def __getitem__(self, idx): print("触发__getitem__索引方法") return super().__getitem__(idx) def __new__(cls, *args, **kwargs): print("触发__new__构造方法") return super().__new__(cls, *args, **kwargs) # 显式调用自定义类构造创建实例 cl = CustomList([1,2,3]) # 会打印"触发__new__构造方法" # 用[]字面量直接创建列表 l = [1,2,3] # 无任何打印,直接生成原生list实例,不会触发自定义类的任何逻辑 # 索引操作 print(cl[0]) # 先打印"触发__getitem__索引方法",再打印1
内容的提问来源于stack exchange,提问作者user7868
相关产品推荐
相关产品推荐

