Khóa học python

Copy List trong Python

0 phút đọc

Trong Python, việc sao chép (copy) một danh sách (list) là một thao tác quan trọng và thường xuyên được sử dụng. Có nhiều phương pháp để sao chép một danh sách, mỗi phương pháp có ưu và nhược điểm riêng. Bài viết này sẽ hướng dẫn chi tiết cách sao chép danh sách trong Python, kèm theo các ví dụ minh họa.

Tại sao cần sao chép danh sách?

Danh sách trong Python là một kiểu dữ liệu có thể thay đổi (mutable), nghĩa là bạn có thể thay đổi nội dung của nó mà không thay đổi danh tính của nó. Khi bạn sao chép một danh sách, bạn có thể muốn giữ nguyên danh sách gốc trong khi thực hiện các thay đổi trên bản sao. Điều này giúp tránh các tác động không mong muốn lên dữ liệu gốc.

Các phương pháp sao chép danh sách

Sử dụng phép gán (Assignment)

Phép gán không thực sự tạo ra một bản sao của danh sách mà chỉ tạo ra một tham chiếu mới đến cùng một đối tượng danh sách. Điều này có nghĩa là bất kỳ thay đổi nào trên danh sách mới cũng sẽ ảnh hưởng đến danh sách gốc.

original_list = [1, 2, 3, 4]
copied_list = original_list

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4, 5]
Copied List: [1, 2, 3, 4, 5]

Sử dụng phương thức copy()

Phương thức copy() tạo ra một bản sao nông (shallow copy) của danh sách. Bản sao nông chỉ sao chép các tham chiếu đến các đối tượng con, không sao chép các đối tượng con thực sự.

original_list = [1, 2, 3, 4]
copied_list = original_list.copy()

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng hàm list()

Hàm list() cũng tạo ra một bản sao nông của danh sách.

original_list = [1, 2, 3, 4]
copied_list = list(original_list)

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng kỹ thuật slicing

Kỹ thuật slicing là một cách ngắn gọn để tạo ra một bản sao nông của danh sách.

original_list = [1, 2, 3, 4]
copied_list = original_list[:]

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng hàm copy.copy()

Hàm copy.copy() từ module copy tạo ra một bản sao nông của danh sách.

import copy

original_list = [1, 2, 3, 4]
copied_list = copy.copy(original_list)

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng hàm copy.deepcopy()

Hàm copy.deepcopy() tạo ra một bản sao sâu (deep copy) của danh sách. Bản sao sâu sao chép toàn bộ cấu trúc của danh sách, bao gồm cả các đối tượng con.

import copy

original_list = [1, 2, [3, 4], 5]
copied_list = copy.deepcopy(original_list)

copied_list[2].append(6)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, [3, 4], 5]
Copied List: [1, 2, [3, 4, 6], 5]

So sánh Shallow Copy và Deep Copy

Shallow Copy

Shallow copy chỉ sao chép các tham chiếu đến các đối tượng con, không sao chép các đối tượng con thực sự. Điều này có nghĩa là nếu bạn thay đổi một đối tượng con trong bản sao, thay đổi đó cũng sẽ xuất hiện trong danh sách gốc.

import copy

original_list = [1, 2, [3, 4], 5]
shallow_copied_list = copy.copy(original_list)

shallow_copied_list[2].append(6)
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

Output:

Original List: [1, 2, [3, 4, 6], 5]
Shallow Copied List: [1, 2, [3, 4, 6], 5]

Deep Copy

Deep copy sao chép toàn bộ cấu trúc của danh sách, bao gồm cả các đối tượng con. Điều này có nghĩa là nếu bạn thay đổi một đối tượng con trong bản sao, thay đổi đó sẽ không ảnh hưởng đến danh sách gốc.

import copy

original_list = [1, 2, [3, 4], 5]
deep_copied_list = copy.deepcopy(original_list)

deep_copied_list[2].append(6)
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

Output:

Original List: [1, 2, [3, 4], 5]
Deep Copied List: [1, 2, [3, 4, 6], 5]

Các phương pháp khác để sao chép danh sách

Sử dụng vòng lặp for và phương thức append()

Bạn có thể sử dụng vòng lặp for để sao chép từng phần tử của danh sách vào một danh sách mới.

original_list = [1, 2, 3, 4]
copied_list = []

for item in original_list:
    copied_list.append(item)

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng list comprehension

List comprehension là một cách ngắn gọn và hiệu quả để sao chép danh sách.

original_list = [1, 2, 3, 4]
copied_list = [item for item in original_list]

copied_list.append(5)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, 3, 4]
Copied List: [1, 2, 3, 4, 5]

Sử dụng module json

Module json có thể được sử dụng để sao chép danh sách bằng cách chuyển đổi danh sách thành chuỗi JSON và sau đó chuyển đổi lại thành danh sách.

import json

original_list = [1, 2, [3, 4], 5]
copied_list = json.loads(json.dumps(original_list))

copied_list[2].append(6)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [1, 2, [3, 4], 5]
Copied List: [1, 2, [3, 4, 6], 5]

Sao chép danh sách lồng nhau

Danh sách lồng nhau là danh sách chứa các danh sách con. Khi sao chép danh sách lồng nhau, bạn cần chú ý đến việc sao chép các đối tượng con.

Sử dụng vòng lặp lồng nhau

original_list = [[1, 2], [3, 4], [5, 6]]
copied_list = []

for sublist in original_list:
    copied_list.append(sublist[:])

copied_list[0].append(7)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [[1, 2], [3, 4], [5, 6]]
Copied List: [[1, 2, 7], [3, 4], [5, 6]]

Sử dụng list comprehension

original_list = [[1, 2], [3, 4], [5, 6]]
copied_list = [sublist[:] for sublist in original_list]

copied_list[0].append(7)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [[1, 2], [3, 4], [5, 6]]
Copied List: [[1, 2, 7], [3, 4], [5, 6]]

Sử dụng copy.deepcopy()

import copy

original_list = [[1, 2], [3, 4], [5, 6]]
copied_list = copy.deepcopy(original_list)

copied_list[0].append(7)
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [[1, 2], [3, 4], [5, 6]]
Copied List: [[1, 2, 7], [3, 4], [5, 6]]

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu nhiều phương pháp khác nhau để sao chép danh sách trong Python, bao gồm cả sao chép nông (shallow copy) và sao chép sâu (deep copy). Mỗi phương pháp có ưu và nhược điểm riêng, và việc lựa chọn phương pháp nào phụ thuộc vào yêu cầu cụ thể của bạn. Hy vọng rằng các ví dụ minh họa này sẽ giúp bạn hiểu rõ hơn về cách sao chép danh sách trong Python và áp dụng chúng vào các bài toán thực tế của mình.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Cho biết một số ưu điểm của Linked List?

entry

Hãy định nghĩa về Linked List?

entry

Hãy định nghĩa về Linked List?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely