Sao chép một danh sách trong Python đề cập đến việc tạo ra một danh sách mới chứa các phần tử giống như danh sách gốc. Có nhiều phương pháp để sao chép một danh sách, bao gồm việc sử dụng cú pháp cắt (slice notation), hàm list(), và sử dụng phương thức copy().
Mỗi phương thức hoạt động khác nhau về việc nó tạo ra bản sao nông hay bản sao sâu. Hãy cùng thảo luận về tất cả những điều này một cách sâu sắc trong hướng dẫn này.
Một bản sao nông trong Python tạo ra một đối tượng mới, nhưng thay vì sao chép các phần tử một cách đệ quy, nó chỉ sao chép các tham chiếu đến các phần tử gốc. Điều này có nghĩa là đối tượng mới là một thực thể riêng biệt so với đối tượng gốc, nhưng nếu các phần tử tự nó có thể thay đổi, thì những thay đổi được thực hiện đối với các phần tử đó trong đối tượng mới sẽ ảnh hưởng đến đối tượng gốc.
Hãy minh họa điều này với ví dụ sau −
import copy # Original list original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Creating a shallow copy shallow_copied_list = copy.copy(original_list) # Modifying an element in the shallow copied list shallow_copied_list[0][0] = 100 # Printing both lists print("Original List:", original_list) print("Shallow Copied List:", shallow_copied_list)
Như bạn có thể thấy, mặc dù chúng ta chỉ sửa đổi phần tử đầu tiên của danh sách con đầu tiên trong danh sách sao chép nông, nhưng sự thay đổi đó cũng được phản ánh trong danh sách gốc.
Điều này là vì một bản sao nông chỉ tạo ra các tham chiếu mới đến các đối tượng gốc, thay vì tạo ra các bản sao của chính các đối tượng đó.
Original List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]] Shallow Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]
Một bản sao sâu trong Python tạo ra một đối tượng hoàn toàn mới và sao chép đệ quy tất cả các đối tượng được tham chiếu bởi đối tượng gốc. Điều này có nghĩa là ngay cả các đối tượng lồng nhau bên trong đối tượng gốc cũng được sao chép, dẫn đến một bản sao hoàn toàn độc lập, nơi các thay đổi được thực hiện trên đối tượng đã sao chép không ảnh hưởng đến đối tượng gốc, và ngược lại.
Hãy minh họa điều này với ví dụ sau −
import copy # Original list original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Creating a deep copy deep_copied_list = copy.deepcopy(original_list) # Modifying an element in the deep copied list deep_copied_list[0][0] = 100 # Printing both lists print("Original List:", original_list) print("Deep Copied List:", deep_copied_list)
Như bạn có thể thấy, khi chúng ta sửa đổi phần tử đầu tiên của danh sách con đầu tiên trong danh sách sao chép sâu, điều đó không ảnh hưởng đến danh sách gốc.
Điều này là vì một bản sao sâu tạo ra một đối tượng mới và sao chép đệ quy tất cả các đối tượng lồng ghép, đảm bảo rằng đối tượng được sao chép hoàn toàn độc lập với đối tượng gốc.
Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Deep Copied List: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]
Cú pháp cắt trong Python cho phép bạn tạo ra một chuỗi con của các phần tử từ một chuỗi (như danh sách, tuple hoặc chuỗi ký tự) bằng cách chỉ định chỉ số bắt đầu, chỉ số kết thúc và kích thước bước tùy chọn. Cú pháp cho cú pháp cắt như sau −
[start:end:step]
Ở đâu, start là chỉ số mà đoạn cắt bắt đầu, end là chỉ số mà đoạn cắt kết thúc (không bao gồm), và step là kích thước bước giữa các phần tử.
Chúng ta có thể sao chép một danh sách bằng cách sử dụng cú pháp cắt (slice notation) bằng cách chỉ định toàn bộ phạm vi chỉ số của danh sách gốc. Điều này sẽ tạo ra một danh sách mới với các phần tử giống hệt như danh sách gốc.
Any modifications made to the copied list will not affect the original list, and vice versa, because they are separate objects in memory.
Trong ví dụ này, chúng ta đang tạo một phần của "original_list", hiệu quả là sao chép tất cả các phần tử của nó vào một danh sách mới "copied_list" −
# Original list original_list = [1, 2, 3, 4, 5] # Copying the list using slice notation copied_list = original_list[1:4] # Modifying the copied list copied_list[0] = 100 # Printing both lists print("Original List:", original_list) print("Copied List:", copied_list)
Chúng ta nhận được kết quả như hình dưới đây −
Original List: [1, 2, 3, 4, 5] Copied List: [100, 3, 4]
Hàm list() trong Python là một hàm tích hợp sẵn được sử dụng để tạo một đối tượng danh sách mới. Nó có thể chấp nhận một iterable (như danh sách khác, tuple, set, v.v.) làm tham số và tạo ra một danh sách mới chứa các phần tử của iterable đó. Nếu không có tham số nào được cung cấp, một danh sách rỗng sẽ được tạo ra.
Chúng ta có thể sao chép một danh sách bằng cách sử dụng hàm list() và truyền danh sách gốc vào làm tham số. Điều này sẽ tạo ra một đối tượng danh sách mới chứa các phần tử giống như danh sách gốc.
Trong ví dụ dưới đây, chúng ta đang tạo một đối tượng danh sách mới "copied_list" chứa các phần tử giống như "original_list" bằng cách sử dụng hàm list() −
# Original list original_list = [1, 2, 3, 4, 5] # Copying the list using the list() constructor copied_list = list(original_list) # Printing both lists print("Original List:", original_list) print("Copied List:", copied_list)
Dưới đây là kết quả của đoạn mã trên −
Original List: [1, 2, 3, 4, 5] Copied List: [1, 2, 3, 4, 5]
Trong Python, hàm copy() được sử dụng để tạo một bản sao nông của một danh sách hoặc các đối tượng có thể thay đổi khác. Hàm này là một phần của module copy trong thư viện chuẩn của Python.
Chúng ta có thể sao chép một danh sách bằng cách sử dụng hàm copy() bằng cách gọi nó trên danh sách gốc. Điều này tạo ra một đối tượng danh sách mới chứa các phần tử giống như danh sách gốc.
Trong ví dụ sau, chúng ta sử dụng hàm copy() để tạo một đối tượng danh sách mới "copied_list" chứa các phần tử giống như "original_list" −
import copy original_list = [1, 2, 3, 4, 5] # Copying the list using the copy() function copied_list = copy.copy(original_list) print("Copied List:", copied_list)
Đầu ra của đoạn mã trên như sau −
Copied List: [1, 2, 3, 4, 5]