Những gì bạn đang cố gắng ở đây được gọi là Slice Assingnment. Trong python, bạn có thể chỉ định một trường hợp có thể lặp lại (my_list[1]
trong trường hợp của bạn) thành một lát khác có thể lặp lại (my_list[0:1]
trong trường hợp của bạn). Cho phép đi bộ qua một số ví dụ để hiểu những gì nó thực sự có nghĩa là:
>>> l = [1,2,3,4,5]
>>> b = [6,7,8]
>>> l[0:3] = b
>>> l
>>> [6, 7, 8, 4, 5]
Vì vậy, những gì xảy ra ở đây là một phần của danh sách l
cho 0,1,2
phêìn trong đó bao gồm các yếu tố 1,2,3
được thay thế bởi các yếu tố của danh sách b
6,7,8
. Tuy nhiên trong trường hợp này, kích thước của slice và các phần tử được thay thế sẽ xảy ra bằng cơ hội.
Vậy điều gì sẽ xảy ra khi kích thước lát và iterable phải được thay thế không bằng nhau
>>> l = [1,2,3,4,5]
>>> b = [6,7,8]
>>> l[0:4] = b
>>> l
>>> [6,7,8,5]
ý rằng hoạt động này đã không tạo ra bất kỳ lỗi, thay vào đó, nó chỉ sao chép bất cứ yếu tố có sẵn với toàn bộ phần thái lát . Trong trường hợp này, các phần tử đã cắt lát là 1,2,3,4
được thay thế bằng 6,7,8
Trong ví dụ trước có thể thay thế được thay thế nhỏ hơn.Chuyện gì xảy ra nếu phần lát nhỏ
>>> l = [1,2,3,4,5]
>>> b = [6,7,8]
>>> l[0:1] = b
>>> l
>>> [6,7,8,2,3,4,5]
Vì vậy, bây giờ chúng ta có thể thấy rằng chỉ phần tử đầu tiên được thay thế bằng toàn bộ iterable b
.
Bạn cũng có thể sử dụng hành vi này để xóa một phần cụ thể của danh sách (Tôi thấy thuận tiện trong một số trường hợp).
>>> l = [1,2,3,4,5]
>>> l[0:2] = []
>>> l
>>> [3,4,5]
Hai yếu tố đầu tiên được xóa rất tiện lợi tại đây.
Ví dụ trong câu hỏi của bạn tương tự như ví dụ tôi đã đăng ở trên, ngoại trừ trường hợp của bạn, có thêm một bước là giải nén giá trị danh sách. Việc giải nén giá trị danh sách xảy ra mỗi khi bạn gán danh sách vào danh sách khác. Một ví dụ ngắn
>>> l = [[1]]
>>> a = []
>>> a = l[0]
>>> a
>>> [1]
dụ của bạn bây giờ:
#Replace the slice [0:1] with my_list[1] perform unpacking list values as well
>>> my_list[1:2] = my_list[1]
>>> [1,2,3,4,5]
Cũng lưu ý rằng việc chuyển nhượng lát chỉ có thể nếu bạn gán iterable để một lát. Nếu bạn cố gắng gán một int hoặc cái gì đó không phải là một iterable để một trăn slice sẽ ném một lỗi.
>>> l = [1,2,3,4,5]
>>> b = [6,7,8]
>>> l[0:1] = b[1]
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
Đó là lý do tại sao trong trường hợp của bạn my_list[1]
không gây ra lỗi vì nó có thể lặp lại được.
'my_list = [1,2,3]; my_list [1: 2] = [9,8,7] '=>' [1, 9, 8, 7,3] 'Tôi nghĩ đó là hành vi bình thường của python trong khi thay thế slice bằng danh sách – splash58
Sử dụng' my_list này [1: 2] = [my_list [1]] ' – Artier
Tôi đã chỉnh sửa một trong các câu trả lời ở đó để đề cập rõ ràng rằng bạn có thể sử dụng các danh sách có kích thước khác nhau ở cả hai phía của bài tập. * "Hãy để một mình giải thích lý do tại sao nó hoạt động theo cách của nó." * Bạn mong đợi loại câu trả lời nào? https://stackoverflow.com/a/10623352/2301450 và https://stackoverflow.com/a/35632876/2301450 đều chính xác. – vaultah