这可能是一个愚蠢的问题
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__
方法。