这可能是一个愚蠢的问题,但我想知道,当我们有一个容器对象,如列表或元组,我们将其编入索引:
l = [2,4,5,6]
l[0]
在我们得到的控制台中:
out[#]: 2
如果我们这样做,我们会得到同样的方式:
def ret(num):
return num
ret(1)
当我们索引列表或元组等时,是否存在隐藏的函数调用?
答案 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__
方法。