2012-01-05 29 views
9

thể trùng lặp:
Python 2D list has weird behavor when trying to modify a single valuepython hiểu: sáng tạo mảng 2ngày

folks,

tôi tự hỏi nếu hai câu sau đây đều giống nhau?

a = [[0]*3]*3 
b = [[0]*3 for i in range(3)] 

Kết quả trông giống nhau. Nhưng liệu có cách nào tốt hơn cách khác? Sự khác biệt ở đây là gì.

Cảm ơn rất nhiều sự giúp đỡ của bạn.

nos

+4

Có nghĩa là hàng ngàn câu hỏi bao gồm chủ đề chính xác này ... – JBernardo

Trả lời

17

Họ không giống nhau

>>> a[1][2] = 5 
>>> a 
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]] 


>>> b[1][2] = 5 
>>> b 
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]] 

Đầu tiên một tạo ra một mảng bên ngoài của con trỏ tới một mảng bên trong trong khi thứ hai thực sự tạo ra 3 mảng riêng biệt.

+1

Tôi đã nhập chính xác * chính xác *. +1 cho bạn. – Makoto

+0

yup, trong lần đầu tiên, cả ba mảng đều là cùng một đối tượng. Nếu bạn sử dụng số nguyên thay vì ví dụ [1] * 5 thay vì [[]] * 5, một số nguyên mới được sử dụng ở mỗi vị trí –

+3

đây không phải là mảng python ... đây là danh sách python. – joaquin

7

Không có.
Trong cái đầu tiên bạn có (danh sách) 3 danh sách giống nhau, cùng một tài liệu tham khảo, trong lần thứ hai bạn có ba danh sách khác nhau

>>> a = [[0]*3]*3 
>>> a 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> a[0][0]=1 

>>> a 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]] 


>>> b = [[0]*3 for i in range(3)] 
>>> b 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> b[0][0] = 1 

>>> b 
[[1, 0, 0], [0, 0, 0], [0, 0, 0]] 
+0

1. Hãy thử 'a [0] .append (" foo ")'. –

0

Đó là một trường hợp điển hình của nông-copy vs bản sao sâu, như được giải thích here trong tài liệu Python :)

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