2012-06-27 28 views
5

Nếu tôi có danh sách này với 10 yếu tố:Tại sao Python trả về các chỉ mục danh sách phủ định?

>>> l = [1,2,3,4,5,6,7,8,9,0] 

Tại sao sẽ l [10] trở lại một IndexError, nhưng l [-1] trả về 0?

>>> l[10] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
>>> l[0] 
1 
>>> l[-1] 
0 
>>> l[-2] 
9 

Điều tôi muốn làm là ném lỗi nếu không có yếu tố nào trước đó trong danh sách.

+0

Ý của bạn là gì bởi "không có phần tử nào trước đây trong danh sách"? Nếu bằng "trước" bạn có nghĩa là "ở bên trái của phần tử hiện tại", thì câu trả lời của Lattyware sẽ phân phối độc đáo. Nhưng tôi không thể không tự hỏi nếu bạn có ý gì đó khác. –

Trả lời

19

Trong Python, chỉ mục danh sách phủ định cho biết các mục được tính từ bên phải của danh sách (nghĩa là, l[-n] là viết tắt của l[len(l)-n]).

Nếu bạn thấy bạn cần chỉ số tiêu cực để chỉ ra một lỗi, sau đó bạn chỉ có thể kiểm tra các trường hợp đó và nâng cao ngoại trừ bản thân (hoặc xử lý nó sau đó và ở đó):

index = get_some_index() 
if index < 0: 
    raise IndexError("negative list indices are considered out of range") 
do_something(l[index]) 
+0

Không hoàn toàn chắc chắn tôi thích IndexError - nhưng ít nhất nó bây giờ có một tin nhắn. Tôi sẽ khá ngạc nhiên nếu tôi không thể có được phần tử cuối cùng bằng cách sử dụng -1 khi tôi * biết * đó là một danh sách được xây dựng ... Cộng với mở rộng slicing cần một số công việc trên nó ... –

+0

@ JonClements Tôi không đề xuất một lớp con , do đó danh sách sẽ không * cư xử * khác nhau, chỉ trong trường hợp cụ thể mà bạn không muốn các chỉ số tiêu cực có thể, xử lý nó. –

2

Đó là vì l[-1] bằng để l[len(l)-1], tương tự l[-2] bằng l[len(l)-2]

>>> lis=[1,2,3,4,5] 
>>> lis[-1],lis[-2],lis[-3] 
(5, 4, 3) 
>>> lis[len(lis)-1],lis[len(lis)-2],lis[len(lis)-3] 
(5, 4, 3) 
1

Q: Tại sao sẽ trả về một l[10] n IndexError, nhưng l[-1] trả về 0?

A: Bởi vì giá trị chỉ mục bằng Python (như trong nhiều ngôn ngữ khác) là không dựa trên. Điều đó có nghĩa là mục đầu tiên được lưu trữ tại chỉ số 0.

Danh sách của bạn

l = [1,2,3,4,5,6,7,8,9,0] 

có 10 mặt hàng. Vì chỉ mục bắt đầu tại 0, mục cuối cùng sẽ ở chỉ mục 9. Khi bạn cố gắng truy cập danh sách của mình tại chỉ mục 10, Python sẽ ném một ngoại lệ IndexError để cho bạn biết rằng đây không phải là giá trị chỉ mục hợp lệ và nằm ngoài giới hạn.

Python cũng sử dụng quy ước giá trị chỉ mục phủ định để truy cập các mục từ "cuối" của danh sách hoặc chuỗi. Giá trị chỉ mục -1 cho biết mục cuối cùng trong danh sách, -2 từ tiếp theo đến lần cuối vv Vì mục cuối cùng trong danh sách của bạn là 0, đây là những gì l[-1] trả về.

@ Câu trả lời của Lattyware đã cho bạn thấy cách tạo/ném ngoại lệ, tôi hy vọng điều này sẽ trả lời câu hỏi ban đầu của bạn.

Các vấn đề liên quan