Tại sao nó hoạt động trên NumPy nhưng không phải danh sách Python
Vì với __getitem__
bạn có thể lập trình cho bạn các lớp để làm bất cứ điều gì bạn muốn với :
và nhiều đối số.
Numpy thực hiện điều này, nhưng được xây dựng trong list
s thì không.
Chính xác hơn:
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
Sau đó chúng tôi có thể mở đối tượng lát như:
s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3
Vì vậy, đó là lý do tại sao khi bạn viết:
[][1, 2]
Python nói:
TypeError: list indices must be integers, not tuple
vì bạn đang cố gắng vượt qua (1, 2)
vào danh sách __getitem__
của danh sách và danh sách được tích hợp sẵn không được lập trình để xử lý đối số tuple, chỉ số nguyên.
Rất thú vị! Tôi cúi đầu với khả năng gỡ lỗi tâm linh của bạn! :) –