4

I recently came across this way of indexing 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 index it using the boolean value False it returns Peter and if I index it 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?

1
  • 2
    @xg.plt.py, I was wrong. Have a look at wim's answer below. Commented Apr 3, 2018 at 15:07

2 Answers 2

6

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 subscription, allowing arbitrary objects to be used for indexing and slicing:

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.

Sign up to request clarification or add additional context in comments.

1 Comment

A MyInt is already an int, so Python doesn't actually need to perform a conversion to int. I'd say both results are consistent with the data model.
2

In Python, bool class is derived from of int Hence True=1 and False=0

print (True + True) will give an output 2

So on a list ['peter', 'john', 'abhi'][True] returns 2nd element of the list i.e. john

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.