2011-10-12 48 views
25

Tôi đã gặp phải những gì tôi nghĩ là một hành vi lạ trong Python, và tôi muốn ai đó giải thích nó nếu có thể.Thêm vào danh sách 2D trong Python

tôi đã tạo ra một danh sách trống 2D

listy = [[]]*3 

print listy 

[[], [], []] 

Các công trình sau đây như tôi mong đợi:

listy[1] = [1,2] sản lượng [[], [1,2], []]

listy[1].append(3) sản lượng [[], [1,2,3], []]

Tuy nhiên, khi tôi nối thêm vào một trong các danh sách trống, python nối thêm TẤT CẢ các danh sách con, như sau:

listy[2].append(1) sản lượng [[1], [1,2,3], [1]].

Có ai có thể giải thích cho tôi tại sao hành vi này xảy ra không?

+4

Tôi tự hỏi số lần mỗi tháng được hỏi. Chắc chắn đây là một trong những câu hỏi thường gặp nhất về Python (và không chỉ trên Stack Overflow). Từ Câu hỏi thường gặp trong tài liệu Python chính thức: [Làm cách nào để tạo danh sách đa chiều?] (Http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) –

Trả lời

44

Bạn chưa tạo ba khác nhau danh sách trống. Bạn đã tạo một danh sách trống và sau đó tạo danh sách mới với ba tham chiếu đến cùng một danh sách trống. Để khắc phục việc sử dụng vấn đề mã này thay vì:

listy = [[] for i in range(3)] 

Chạy mã ví dụ của bạn bây giờ cung cấp cho các kết quả mà bạn có thể mong đợi:

>>> listy = [[] for i in range(3)] 
>>> listy[1] = [1,2] 
>>> listy 
[[], [1, 2], []] 
>>> listy[1].append(3) 
>>> listy 
[[], [1, 2, 3], []] 
>>> listy[2].append(1) 
>>> listy 
[[], [1, 2, 3], [1]] 
+0

+1 để được giải thích kỹ lưỡng – heltonbiker

+0

Điều này có ý nghĩa rất nhiều. Cảm ơn. –

12

[[]]*3 là không giống như [[], [], []].

Đó là nếu bạn muốn nói

a = [] 
listy = [a, a, a] 

Nói cách khác, cả ba tài liệu tham khảo danh sách tham khảo các ví dụ cùng một danh sách.

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