当我们索引诸如列表或元组之类的对象时是否发生了函数调用?

时间:2016-12-15 16:08:47

标签: python

这可能是一个愚蠢的问题,但我想知道,当我们有一个容器对象,如列表或元组,我们将其编入索引:

l = [2,4,5,6]
l[0]
在我们得到的控制台中

out[#]: 2

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

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

当我们索引列表或元组等时,是否存在隐藏的函数调用?

2 个答案:

答案 0 :(得分:5)

你的假设是正确的。 Python具有某些"magic methods",它们使用相应的运算符从对象中调用。下标运算符([])就是其中之一。魔术方法称为__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
>>> 

<强>资源

答案 1 :(得分:2)

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