2014-04-09 20 views
8

Trong khi chơi với mảng cắt tôi nhận thấy rằng a[index:] or a[:index] loại cắt không tạo ra chỉ mục mảng ra khỏi lỗi bị ràng buộc cho chuỗi.Tại sao việc cắt danh sách của python không tạo ra chỉ mục ra khỏi lỗi bị ràng buộc?

str = "abcde" 
print str[10:] 
print str[:10] 

sản xuất đầu ra:

'' 
abcde 

Ai có thể giải thích tại sao? Không nên nó tạo ra chỉ số mảng ngoài giới hạn lỗi? Python không tạo ra lỗi này nếu tôi cố gắng làm một cái gì đó như: print str[10].

+0

@senderle: cảm ơn con trỏ – tejas

Trả lời

11

Cắt lát được sử dụng để tạo danh sách mới. Nếu các chỉ mục không nằm trong phạm vi số lượng phần tử trong danh sách, chúng tôi có thể trả lại danh sách trống. Vì vậy, chúng tôi không phải ném một lỗi. Tuy nhiên, nếu chúng ta cố gắng truy cập các phần tử trong danh sách lớn hơn số phần tử, chúng ta không thể trả về bất kỳ giá trị mặc định nào (thậm chí không None vì nó có thể là giá trị hợp lệ trong danh sách). Đó là lý do tại sao

IndexError: list index out of range 

được ném.

Trong khi cắt, nếu chỉ số bắt đầu lớn hơn hoặc bằng với chiều dài của chuỗi, chiều dài của chuỗi trở lại được đặt bằng 0, trong này line

defstop = *step < 0 ? -1 : length; 
... 
if (r->stop == Py_None) { 
    *stop = defstop; 
} 
... 
if ((*step < 0 && *stop >= *start) 
    || (*step > 0 && *start >= *stop)) { 
    *slicelength = 0; 

Đối với Strings, nếu độ dài của chuỗi được trả về sau khi cắt là 0, sau đó nó trả về một chuỗi rỗng, trong this line

if (slicelength <= 0) { 
    return PyString_FromStringAndSize("", 0); 
} 
1

Đó là cách toán tử cắt được triển khai trong python. Nếu các chỉ số mảng vượt quá giới hạn, nó sẽ tự động cắt ngắn sau đó tại đúng vị trí.

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