python列表反向切片索引,使用布尔索引从Python列表中切片元素

I recently came across this way of slicing a list in Python. I've never seen this one before, so I would like to understand this clearly.

I have a list ["Peter", "James", "Mark"] and if I slice it using the boolean value False it returns Peter and if I slice using True it returns James, as given below

["Peter", "James", "Mark"][False] => Peter

["Peter", "James", "Mark"][True] => James

I would like to know what happens here and what is this method called as?

解决方案

The datamodel hook here is the __index__ magic method:

>>> True.__index__()

1

>>> False.__index__()

0

The value returned by on obj's __index__ is used when accessing with subscripting, allowing arbitrary objects to be used with slices:

x[obj]

This is somewhat independent of the fact that bool is a subclass of int! You may achieve the same with any object.

>>> class A:

... def __index__(self):

... return 1

...

>>> 'ab'[A()]

'b'

Whether __index__ is resolved for int subclasses depends on implementation detail.

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 behaves correctly according to the Python datamodel. Looks like CPython is taking a shortcut / performance optimization.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值