2010-03-29 43 views
19

Xin chào Tôi muốn sao chép danh sách 2D, để nếu tôi sửa đổi 1 danh sách, danh sách kia không được sửa đổi.Sao chép danh sách 2D vào python

Đối với danh sách 1 D, tôi chỉ làm điều này:

a = [1,2] 
b = a[:] 

Và bây giờ nếu tôi sửa đổi b, a không được sửa đổi.

Nhưng điều này không làm việc cho danh sách 2D:

a = [[1,2],[3,4]] 
b = a[:] 

Nếu tôi sửa đổi b, a được sửa đổi là tốt.

Làm cách nào để khắc phục sự cố này?

+3

Cả rất nhiều thời gian khi người dùng lồng danh sách và cần phải sao chép chúng theo cách này, họ thực sự muốn sử dụng 'numpy'. –

Trả lời

34

Đối với một giải pháp tổng quát hơn mà làm việc không phụ thuộc vào số lượng kích thước, sử dụng copy.deepcopy():

import copy 
b = copy.deepcopy(a) 
+0

Mặc dù trong hầu hết các trường hợp, tôi có thể nói 'từ sao chép bản in sâu vì không có xung đột tên và trông đẹp hơn. ;) – Amber

+1

@Dav, bạn tạo một điểm hợp lệ. Tôi thích luôn nhập các mô-đun để tránh xung đột tên thay vì xử lý các hàm theo từng trường hợp. :) –

+0

Lưu ý rằng điều này cũng sẽ làm sâu sắc các phần tử thực trong danh sách. – FogleBird

35
b = [x[:] for x in a] 
+4

+1 kể từ khi thích hợp. Cá nhân tôi thích tránh sao chép/in sâu (rất hiếm khi có trường hợp sử dụng hợp lệ cho họ trong cuộc sống thực; cùng có thể nói cho một danh sách có nhiều hơn 2 kích thước imo) – ChristopheD

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