当我们索引一个对象(例如列表或元组)时,是否会发生函数调用



这可能是一个愚蠢的问题

l = [2,4,5,6]
l[0]

在控制台中我们得到:

out[#]: 2

如果我们这样做的话,我们会得到的方式相同:

def ret(num):
    return num
ret(1)

当我们索引列表或元组等时,是否有隐藏的功能调用?

您的假设是正确的。Python具有某些"魔法方法",这些方法是使用相应运算符从对象调用的。下标操作员([])是其中之一。魔术方法称为__getitem__()__getitem__()的文档提供了更多信息:

呼吁实施self[key]的评估。对于序列类型,接受的键应为整数和切片对象。请注意,负索引的特殊解释(如果类希望模仿序列类型)取决于__getitem__()方法。如果键是不适当的类型,则可以提高TypeError;如果在序列的索引集之外的值(在对负值进行任何特殊解释之后),则应提高IndexError。对于映射类型,如果丢失键(不在容器中),则应提高KeyError

您可以通过手动调用__getitem__()的工作方式:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.__getitem__(0)
1
>>> lst.__getitem__(1)
2
>>> lst.__getitem__(2)
3
>>> # etc...

还有其他几种类似于__getitem__()的方法;__setitem__()__delitem__()__setitem__()将列表中的给定索引设置为给定值。调用该方法的句法糖为sequence[index] = value。另一方面,__delitem__()在给定索引处删除值。它的句法糖为del sequence[index]。两种方法都可以手动调用并观察到:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.__setitem__(0, 10)
>>> lst.__getitem__(0)
10
>>> lst.__delitem__(0)
>>> lst.__getitem__(0)
2
>>> 

资源

  • Python 3文档。第3.3节特殊方法名称

是;对象映射到特殊方法上的所有操作。在这种情况下,这是__getitem__方法。

相关内容

最新更新