这可能是一个愚蠢的问题,但我想知道,当我们有一个容器对象,如列表或元组,我们索引它:
l = [2,4,5,6]
l[0]
Run Code Online (Sandbox Code Playgroud)
在控制台中我们得到:
out[#]: 2
Run Code Online (Sandbox Code Playgroud)
如果我们这样做,我们会得到同样的方式:
def ret(num):
return num
ret(1)
Run Code Online (Sandbox Code Playgroud)
当我们索引列表或元组等时,是否存在隐藏的函数调用?
你的假设是正确的.Python有一些"魔术方法",它们使用相应的运算符从对象中调用.下标operator([])就是其中之一.魔术方法被称为__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...
Run Code Online (Sandbox Code Playgroud)
还有其他几种类似的方法__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
>>>
Run Code Online (Sandbox Code Playgroud)
资源