Tôi chắc chắn điều này đã được trả lời ở đâu đó nhưng tôi không chắc chắn cách mô tả nó.Tạo danh sách con bằng cách sử dụng phép nhân (*) hành vi bất ngờ
Hãy nói rằng tôi muốn tạo ra một danh sách có chứa 3 danh sách rỗng, như vậy:
lst = [[], [], []]
Tôi nghĩ rằng tôi đã được tất cả thông minh bằng cách làm này:
lst = [[]] * 3
Nhưng tôi phát hiện ra, sau khi gỡ lỗi một số hành vi kỳ lạ, điều này gây ra một bản cập nhật chắp thêm vào một danh sách con, nói lst[0].append(3)
, để cập nhật toàn bộ danh sách, làm cho nó [[3], [3], [3]]
thay vì [[3], [], []]
.
Tuy nhiên, nếu tôi khởi tạo danh sách với
lst = [[] for i in range(3)]
sau đó làm lst[1].append(5)
cung cấp cho các dự [[], [5], []]
Câu hỏi của tôi là tại sao điều này xảy ra? Thật thú vị khi lưu ý rằng nếu tôi làm
lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
sau đó là 'liên kết' của tế bào bị phá vỡ 0 và tôi nhận được [[5,3],[],[]]
, nhưng lst[1].append(0)
vẫn gây [[5,3],[0],[0]
.
Đoán tốt nhất của tôi là sử dụng phép nhân trong biểu mẫu [[]]*x
làm cho Python lưu trữ tham chiếu đến một ô đơn lẻ ...?
@RoadieRich Nhưng câu trả lời ở đây có giải thích tốt hơn và liên kết đến tài liệu chính thức. –
@AseemBansal: Sau đó, những câu trả lời đó sẽ được thêm vào câu hỏi * khác * thay vì có lẽ? –
Đó chắc chắn là một bản sao. http://stackoverflow.com/questions/240178/unexpected-feature-in-a-python-list-of-lists và http://stackoverflow.com/questions/1605024/python-using-the-multiply-operator- to-create-copy-of-objects-in-lists và http://stackoverflow.com/questions/6688223/python-list-multiplication-3-makes-3-lists-which-mirror-each-other-when? lq = 1 và những người khác tôi không thể tìm thấy ngay bây giờ. –