我最近遇到过在Python中切片列表的方式。我以前从未见过这个,所以我想清楚地理解这一点。
我有一个列表["Peter", "James", "Mark"]
如果我使用布尔值False
对其进行切片,则会返回Peter
,如果我使用True
进行切片,则返回James
,如下所示
["Peter", "James", "Mark"][False] => Peter
["Peter", "James", "Mark"][True] => James
我想知道这里发生了什么,这个方法叫做什么?
答案 0 :(得分:6)
这里的数据模型钩子是__index__
魔术方法:
>>> True.__index__()
1
>>> False.__index__()
0
使用subscripting访问时,使用obj的__index__
返回的值,允许任意对象与切片一起使用:
x[obj]
这有点独立于bool
是int
的子类的事实!您可以使用任何对象实现相同的目标。
>>> class A:
... def __index__(self):
... return 1
...
>>> 'ab'[A()]
'b'
是否为__index__
子类解析int
取决于实现细节。
CPython 3.7.1:
>>> class MyInt(int):
... def __index__(self):
... return 1
...
>>> '01'[MyInt(0)]
'0'
PyPy 5.0.1:
>>>> class MyInt(int):
.... def __index__(self):
.... return 1
....
>>>> '01'[MyInt(0)]
'1'
PyPy根据Python datamodel正确运行。看起来CPython正在进行快捷/性能优化。
答案 1 :(得分:2)
在Python中,bool
类派生自int
因此True=1
和False=0
print (True + True)
会输出2
因此,在列表['peter', 'john', 'abhi'][True]
上返回列表的第二个元素,即john