2015-01-22 13 views
37

The Python tutorial giải thích hành vi của slice khi chỉ mục là số âm, nhưng tôi không thể tìm thấy tài liệu mô tả hành vi khi chỉ mục kết thúc đứng trước chỉ mục bắt đầu. (Tôi cũng đã xem Explain Python's slice notation và có lẽ tôi không đọc đủ kỹ lưỡng, nhưng câu trả lời dường như không giải quyết được vấn đề này.)Danh sách [i: j] có được bảo đảm là danh sách trống không nếu danh sách [j] đứng trước danh sách [i]?

Hành vi mà tôi quan sát là danh sách trống được trả về, điều đó có vẻ hợp lý với tôi. Tuy nhiên, nó cũng có vẻ hợp lý đối với tôi vì điều này để trả lại một danh sách các mục giữa ij theo thứ tự đảo ngược hoặc đơn giản là đưa ra một ngoại lệ.

Có phải list[i:j] được bảo đảm là danh sách trống nếu list[j] đứng trước list[i]?

Trả lời

44

Có, nếu j <= i là đúng, lát kết quả sẽ trống, đối với loại Python chuẩn. Để có được kết quả theo thứ tự ngược lại, bạn cần phải thêm một sải chân tiêu cực:

list[i:j:-1] 

rõ ràng là tốt hơn so với tiềm ẩn.

này được ghi chép lại trong Common Sequence Operations, chú thích 4:

Các lát s từ i-j được định nghĩa là chuỗi các mục có chỉ số ki <= k < j. Nếu i hoặc j lớn hơn len(s), hãy sử dụng len(s). Nếu i bị bỏ qua hoặc None, hãy sử dụng 0. Nếu j bị bỏ qua hoặc None, hãy sử dụng len(s). Nếu i lớn hơn hoặc bằng j, lát này trống.

Mỏ nhấn mạnh đậm.

Các loại tùy chỉnh miễn phí để diễn giải điều này một cách khác nhau.

+1

Ah, * đó là * nơi được đề cập trong tài liệu Python. Chính xác những gì tôi đang tìm kiếm. – jamesdlin

+0

Bạn có ý nghĩa gì với chữ in nghiêng "cho các loại Python chuẩn"? – inf

+2

@ bamboon: xử lý các lát là loại cụ thể. Các kiểu 'list',' tuple', 'str',' bytes' và 'range' đều hoạt động như thế này, nhưng nếu bạn thực hiện kiểu của riêng bạn, phương thức' __getitem__' của bạn là miễn phí để xử lý các slice khác nhau. –

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