Sao chép nông so với sao chép sâu trong Python
Hiểu sự khác nhau giữa sao chép nông và sao chép sâu rất quan trọng để tránh biến đổi dữ liệu ngoài ý muốn.
- Sao chép nông chỉ sao chép các phần tử cấp cao nhất của list và không tác động đến các list lồng nhau hoặc đối tượng có thể thay đổi bên trong list vốn tham chiếu đến cùng đối tượng. Các thay đổi ở các đối tượng có thể thay đổi (mutable) sẽ ảnh hưởng cả list gốc và list sao chép.
- Sao chép sâu sao chép đệ quy mọi phần tử, bao gồm list lồng nhau và các đối tượng có thể thay đổi, tạo ra các bản sao độc lập. Các thay đổi ở đối tượng lồng nhau trong list sao chép sẽ không ảnh hưởng đến list gốc.
Tôi khuyến nghị dùng hàm copy.copy() cho sao chép nông và hàm copy.deepcopy() cho sao chép sâu.
|
Phương pháp |
Sao chép nông |
Sao chép sâu |
|
copy() |
✓ |
✗ |
|
Hàm khởi tạo list() |
✓ |
✗ |
|
Cắt list [:] |
✓ |
✗ |
|
copy.copy() |
✓ |
✗ |
|
copy.deepcopy() |
✗ |
✓ |
Cách sao chép list lồng nhau trong Python
Khi xử lý các list lồng nhau hoặc cấu trúc dữ liệu phức tạp, cần các phương pháp sao chép tinh vi hơn. Hãy xem các kỹ thuật khác nhau để xử lý list lồng nhau.
Dùng copy.copy()
Mô-đun copy cung cấp hàm copy() để tạo bản sao nông của list. Hàm copy() diễn đạt rõ ràng hơn so với dùng hàm khởi tạo list() hoặc cắt list [:]. Bạn có thể dùng cách này khi muốn nhấn mạnh việc tạo bản sao nông để cải thiện khả năng đọc hiểu.
Ví dụ dưới đây cho thấy cách sao chép nông một list lồng nhau. Mã sẽ in [1, 2, [99, 4]] vì list lồng nhau vẫn là cùng một đối tượng.
# Import the copy module to access the copy.copy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a shallow copy using copy.copy()
shallow_copied_list = copy.copy(original_list)
# Modifying the nested list in the copied list
shallow_copied_list[2][0] = 99
print(original_list)
[1, 2, [99, 4]]
Dùng copy.deepcopy()
Hàm deepcopy() cũng có trong mô-đun copy. Hàm này tạo bản sao sâu của list, nhân đôi cả list và mọi đối tượng lồng bên trong. deepcopy() rất quan trọng khi làm việc với các đối tượng có thể thay đổi trong list vì nó đảm bảo thay đổi ở list sao chép không ảnh hưởng đến list gốc.
Đoạn mã dưới đây in ra [1, 2, [3, 4]].
# Import the copy module to access the copy.deepcopy() function
import copy
# Original list with nested structure
original_list = [1, 2, [3, 4]]
# Create a deep copy using copy.deepcopy()
deep_copied_list = copy.deepcopy(original_list)
# Modifying the nested list in the copied list
deep_copied_list[2][0] = 99
print(original_list)
[1, 2, [3, 4]]
Kết luận
Hiểu cách sao chép list trong Python rất quan trọng để thao tác dữ liệu hiệu quả. Trong hướng dẫn này, chúng ta đã học các phương pháp khác nhau để sao chép list trong Python và khám phá một số khác biệt giữa sao chép nông và sao chép sâu. Là một nhà phân tích dữ liệu, việc chọn kỹ thuật sao chép list phù hợp dựa trên yêu cầu cụ thể của bạn là rất quan trọng. Tôi khuyến khích bạn thực hành các phương pháp đã thảo luận để hiểu rõ hơn các trường hợp sử dụng.
Học lộ trình kỹ năng Python Programming của DataCamp để nâng cao kỹ năng lập trình với những kỹ thuật tốt nhất. Tôi cũng khuyến khích bạn xem các lộ trình nghề nghiệp Python Developer và Data Analyst with Python để tiếp tục xây dựng các kỹ năng thực tiễn, phù hợp với công việc.

Câu hỏi thường gặp
Sự khác nhau giữa sao chép nông và sao chép sâu là gì?
Sao chép nông tạo một list mới nhưng tham chiếu đến các giá trị giống list gốc, do đó các thay đổi trong các đối tượng bên trong list sao chép sẽ ảnh hưởng đến list gốc. Sao chép sâu tạo một list mới và chèn đệ quy các giá trị từ list gốc, vì vậy các thay đổi đối với đối tượng lồng nhau trong list sao chép sẽ không ảnh hưởng đến list gốc.
Có những phương pháp nào để tạo bản sao nông trong Python?
Bạn có thể tạo bản sao nông của một list bằng phương thức copy(), cắt list [:], hàm khởi tạo list(), hoặc hàm copy() trong mô-đun copy.
Làm thế nào để tạo bản sao sâu của một list trong Python?
Bạn có thể tạo bản sao sâu của một list bằng hàm deepcopy() trong mô-đun copy.
List trong Python là cấu trúc dữ liệu mạnh mẽ để lưu trữ một tập hợp phần tử. Phương pháp sao chép list rất quan trọng khi xử lý dữ liệu vì nó giúp bảo toàn list gốc trong khi thực hiện thao tác trên bản sao. Trong hướng dẫn này, tôi sẽ giải thích các kỹ thuật cơ bản và nâng cao để sao chép list kèm ví dụ thực tiễn.
Trước khi xem các ví dụ khác nhau, tôi khuyến nghị bạn học khóa Introduction to Python của DataCamp để nắm vững những kiến thức cơ bản về Python, bao gồm các cấu trúc dữ liệu Python. Python Cheat Sheet for Beginners cũng sẽ hữu ích để tra cứu các hàm và phương thức khác nhau.
"Python dùng máy photocopy." Ảnh bởi Dall-E.
Câu trả lời nhanh: Cách sao chép một list trong Python
Ví dụ dưới đây cho thấy cách sao chép một list trong Python bằng phương thức
copy(). Lưu ý list gốc vẫn không đổi dù bạn chỉnh sửa list bản sao. Mã sẽ in ra[1, 2, 3].Nhiều kỹ thuật khác để sao chép list trong Python
Trước khi xem các kỹ thuật khác nhau để sao chép list trong Python, hãy xét vì sao chúng ta không dùng toán tử gán
=. Ta không dùng=vì làm vậy sẽ không thực sự tạo một bản sao của list. Toán tử gán chỉ tạo một tham chiếu đến list của chúng ta.Trong ví dụ sau,
original_listvàreference_to_original_listcùng tham chiếu đến một list sau khi gán.Ở đây, mọi thay đổi trên list bản sao sẽ ảnh hưởng đến list gốc và ngược lại. Điều này xảy ra vì hai list được lưu cùng vùng nhớ. Bây giờ, hãy xem các cách khác nhau để thực sự sao chép list.
Dùng phương thức copy()
Phương thức
copy()là phương thức dựng sẵn dùng để tạo bản sao nông (shallow copy) của list.copy()có từ Python 3.3 trở đi. Phương thức này chỉ sao chép cấu trúc list ở cấp độ trên cùng. Cú pháp củacopy()như dưới đây.Trong ví dụ sau, mã sẽ in
[1, 2, 3, 4].Dùng hàm khởi tạo list()
Hàm khởi tạo
list()được dùng để tạo một list mới từ list hiện có, bao gồm mọi phần tử của list gốc. Kỹ thuật này quan trọng khi tạo một đối tượng list mới sao cho thay đổi ở list sao chép sẽ không ảnh hưởng list gốc. Đoạn mã sau in ra[1, 2, 3].Dùng cắt list với [:]
Cắt list
[:]cung cấp cách ngắn gọn để tạo bản sao nông của một list. Phương pháp cắt list[:]hiệu quả vì được triển khai ở mức thấp trong Python. Dưới đây là cú pháp.Đoạn mã sau in ra
[1, 2, 3].Trong ngữ cảnh này, chúng ta dùng cắt list để lấy toàn bộ phần tử trong list, nhưng ở các ngữ cảnh khác, bạn có thể dùng cắt để tạo các sublist bằng cách chỉ định chỉ số bắt đầu và kết thúc.