You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:36:18