2013-09-22 77 views
6

tôi có một danh sách Danh sách nói mysolution:Thay đổi một phần tử trong một danh sách sẽ thay đổi nhiều danh sách ..?

>>>mySolution 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
>>> mySolution[0][0] = 1  
>>> mySolution 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] 

đầu ra Dự định:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

tại sao nó rằng tất cả các yếu tố 1 trong danh sách của tôi về danh sách đang được thay đổi để 1? Tôi chỉ muốn thay đổi phần tử đầu tiên của danh sách đầu tiên thành 1.

+4

Xin lỗi nhà điều hành 'n * list' đáng nể! Tôi thành thật sẽ không phiền nếu nó ném một ngoại lệ khi các loại có thể thay đổi được phát hiện .. – user2246674

Trả lời

8

Điều quan trọng là cách bạn tạo danh sách mysolution gốc của mình. Dường như, nó chứa bốn lần cùng một danh sách đó là lý do tại sao thay đổi nó một lần sẽ làm cho nó thay đổi trong tất cả bốn địa điểm.

Để khởi tạo danh sách không đầy độc lập như vậy, bạn có thể làm như sau:

mysolution = [[0] * 4 for i in range(4)] 
+0

mySolution = [0] * 4 mySolution = [mySolution] * 4 – Pavan

+1

@Pavan: Điều đó sẽ không hoạt động vì nó cùng danh sách bốn lần . poke của giải pháp aviods đó. – flornquake

2

Bởi vì tất cả các danh sách chứa thực tế là cùng danh sách. Khi bạn làm:

l = [0, 0, 0, 0] 
my_solution = [l, l, l] 

Sau đó, my_solution[0], my_solution[1], và my_solution[2] được tham chiếu đến cùng một đối tượng (l).

Nếu bạn sửa đổi danh sách ở một vị trí, nó sẽ thay đổi ở mọi nơi. Đó là vì danh sách là các đối tượng có thể thay đổi.

Thay vào đó, sử dụng nhiều danh sách:

l1 = [0, 0, 0, 0] 
l2 = [0, 0, 0, 0] 
l3 = [0, 0, 0, 0] 
my_solution = [l1, l2, l3] 

nào sẽ làm việc như dự định.

2

Đó là hoàn toàn có thể mà bạn đã tạo trong danh sách như thế này:

mySolution = [0]*4 
mySolution = [mySolution]*4 

Hoặc tương đương:

mySolution = [[0]*4]*4 

Một trong các đoạn mã trên sẽ tạo danh sách có bốn danh sách con là c opies của chính xác, cùng một danh sách con, vì vậy mọi sửa đổi trên một danh sách con sẽ được phản ánh trên các danh sách con khác - chúng là một và giống nhau. Giải pháp là để tạo ra bốn khác nhau danh sách con:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

Hoặc ngắn hơn một chút:

mySolution = [[0]*4 for _ in xrange(4)] 
2

xin lưu ý rằng điều này được làm tốt:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
mySolution[0][0] = 1  
print mySolution 

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

tất cả phụ thuộc vào cách bạn đã khởi tạo solution của mình.này

mySolution = [[0, 0, 0, 0]]*4 
mySolution[0][0] = 1  
print mySolution 

cho

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

vì đây từng mảng [0, 0, 0, 0] trong mySolution là một bản sao của khởi mảng [0, 0, 0, 0] trong [[0, 0, 0, 0]]*4. nếu bạn thay đổi phần tử đầu tiên của mảng đầu tiên, bản sao của nó cũng thay đổi.

với khởi tạo này mySolution = [[0, 0, 0, 0] for x in range(4)] bạn không sao chép mảng nhưng chắp thêm [0,0,0,0] bốn lần, cho kết quả mà bạn đang mong đợi.