Почему это работает с Numpy, но не со списками Python
Потому что с __getitem__
вы можете программировать свои классы так, чтобы они делали что угодно с :
и несколькими аргументами.
Numpy делает это, но встроенные list
s этого не делают.
Точнее:
class C(object):
def __getitem__(self, k):
return k
# Single argument is passed directly.
assert C()[0] == 0
# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)
# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)
# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)
# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)
# Ellipsis class object.
assert C()[...] == Ellipsis
Затем мы можем открыть объекты среза как:
s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3
Так вот почему, когда вы пишете:
[][1, 2]
Python говорит:
TypeError: list indices must be integers, not tuple
, потому что вы пытаетесь передать (1, 2)
в __getitem__
списка, ивстроенные списки не запрограммированы для обработки аргументов кортежа, только целые числа.