2012-06-09 29 views
6
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> u = [4, 5, 6, 7, 8, 9] 
>>> u[1::1] = [3, 2, 1, 0] 
>>> u 
[4, 3, 2, 1, 0] 
>>> u[9:0:-1] = [8, 7, 6, 5] 
>>> u 
[4, 5, 6, 7, 8] 
>>> u[9:0:-1] = [16, 12, 8] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 3 to extended slice of size 4 
>>> u 
[4, 5, 6, 7, 8] 
>>> 

Hành vi mong đợi: không có ngoại lệ được ném vào câu lệnh chuyển nhượng cuối cùng; u nên in trên dòng cuối cùng là [4, 8, 12, 16].Tại sao tôi không thể gán một biến lặp tùy ý cho một lát mở rộng có bước là -1?

Tôi có thể gán cho một lát mở rộng có bước là 1, ngay cả khi tôi có thể chuyển đổi được "độ dài sai". Tại sao sau đó tôi không thể gán cho một lát mở rộng có bước là -1 và nó hoạt động theo cách hiển nhiên?

Trả lời

3

Tôi nghĩ rằng việc tạo một lát mở rộng có bước là 1 hoạt động hiệu quả giống như một lát thông thường chứ không phải là một lát mở rộng.

lát Extended tôi không cho phép bạn thay đổi độ dài của chuỗi, như đã nêu here

Nếu bạn có một chuỗi có thể thay đổi như một danh sách hoặc một mảng bạn có thể gán hoặc xóa một lát mở rộng, nhưng có một số khác biệt giữa việc gán cho các lát mở rộng và thường xuyên. Việc gán cho một lát thông thường có thể được sử dụng để thay đổi độ dài của chuỗi. Các lát mở rộng không linh hoạt. Khi gán cho một slice mở rộng, danh sách ở phía bên phải của câu lệnh phải chứa cùng số lượng các mục như slice mà nó đang thay thế.

Vì lý do tại sao nó hoạt động theo cách này, tôi chỉ có thể đoán đó là do các trường hợp không có hành vi rõ ràng. Lấy ví dụ này:

u = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 
u[0:8:3] = [ 10, 11 ] 

Bạn mong đợi điều này sẽ hoạt động như thế nào? Tôi đoán bạn chỉ có thể thay thế 1 & 4 bằng 10 & 11, nhưng còn 7 thì sao? Bạn có để nó không? Xóa đi? Xóa toàn bộ phần còn lại của chuỗi qua 7? Có lẽ nó chỉ là tôi, nhưng trường hợp này dường như không quá rõ ràng. Mà tôi sẽ giả định là lý do tại sao loại hành vi này chỉ không được phép cho các lát mở rộng.

+2

Làm cho tinh thần. Tuy nhiên, OP là đúng cho một bước -1 hành vi mong đợi là khá rõ ràng, do đó, nó có thể là tốt đẹp để có mà đặc biệt-cased cách một bước 1 là ... – weronika

+0

@weronika Đồng ý, nhưng nói rằng để python devs;) – obmarg

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