Bạn hoàn toàn đúng! 'example'[3:4]
và 'example'[3]
khác nhau về cơ bản, và việc cắt ra bên ngoài giới hạn của một chuỗi (ít nhất là đối với các bản cài sẵn) không gây ra lỗi.
Thoạt nghe có thể ngạc nhiên nhưng khi nghĩ lại sẽ thấy rất hợp lý. Việc lập chỉ mục trả về một mục duy nhất, nhưng việc cắt sẽ trả về một dãy con của các mục. Vì vậy, khi bạn cố gắng lập chỉ mục một giá trị không tồn tại, sẽ không có gì để trả về. Nhưng khi bạn cắt một chuỗi ngoài giới hạn, bạn vẫn có thể trả về một chuỗi trống.
Một phần của điều khó hiểu ở đây là chuỗi hoạt động hơi khác so với danh sách. Hãy xem điều gì sẽ xảy ra khi bạn làm điều tương tự với một danh sách:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Ở đây sự khác biệt là rõ ràng. Trong trường hợp chuỗi, kết quả có vẻ giống nhau vì trong Python, không có ký tự riêng lẻ nào nằm ngoài chuỗi. Một ký tự chỉ là một chuỗi 1 ký tự.
(Để biết ngữ nghĩa chính xác của việc cắt bên ngoài phạm vi của một chuỗi, hãy xem câu trả lời của mgilson .)
[999:9999]
không phải là một chỉ mục, nó là một lát cắt và có các ngữ nghĩa khác nhau. Từ phần giới thiệu python: "Các chỉ số lát cắt tạo được xử lý một cách duyên dáng: chỉ mục quá lớn được thay thế bằng kích thước chuỗi, giới hạn trên nhỏ hơn giới hạn dưới trả về một chuỗi trống."