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

Python解释器如何决定调用__setitem__与__getitem__方法?

Python的索引运算符:解释器如何选择调用__getitem__还是__setitem__?

作为C++开发者,我们习惯了用单一的operator[]处理所有索引操作——不管是读取值还是给索引位置赋值,都会调用同一个方法。比如下面的代码,不管是读取s[0]还是给s[1]赋值,都会触发异常:

struct S
{
    auto operator [](int) -> string
    {
        throw 0;
        return "hello";
    }
};
S s{};
auto v = s[0]; // 抛出异常
s[1] = 127;    // 同样抛出异常

但Python的索引语法是__getitem__和__setitem__两个方法的语法糖,解释器完全根据代码的上下文场景来决定调用哪个方法:

  • 当索引表达式是被读取的对象时(比如赋值语句的右侧、作为函数参数、直接求值),解释器会调用__getitem__。比如a = dict[0],本质是调用dict.__getitem__(0),如果键不存在就会抛出KeyError。
  • 当索引表达式是赋值的目标时(出现在赋值符号=的左侧),解释器会调用__setitem__。比如dict[1] = 127,本质是调用dict.__setitem__(1, 127),对于字典来说,这个方法会自动添加新的键值对,所以不会报错。

举个更复杂的例子,obj[key] += 5这种操作,其实是分两步走:先调用__getitem__获取obj[key]的值,完成加法运算后,再调用__setitem__把新值存回obj[key]的位置。

内容的提问来源于stack exchange,提问作者nikitablack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:15:08