Python - Sao chép danh sách

Xin chào các bạn lập trình viên Python đang học hỏi! Hôm nay, chúng ta sẽ cùng nhau lặn sâu vào thế giới kỳ diệu của việc sao chép danh sách trong Python. Là giáo viên khoa học máy tính gần gũi của bạn, tôi ở đây để hướng dẫn bạn qua hành trình này với những giải thích rõ ràng, nhiều ví dụ, và có lẽ là một两句 joke nữa. Vậy, chúng ta cùng bắt đầu nhé!

Python - Copy Lists

Sao chép danh sách trong Python

Trước khi chúng ta nhảy vào các cách khác nhau để sao chép danh sách, hãy cùng hiểu tại sao chúng ta cần sao chép danh sách trước tiên. Hãy tưởng tượng bạn có một danh sách mua sắm, và bạn muốn chia sẻ nó với bạn cùng phòng. Bạn có thể đưa danh sách gốc của mình cho họ, nhưng nếu họ quyết định thêm "sô-cô-la" vào (ai lại không muốn?),Suddenly, danh sách mua sắm lành mạnh của bạn đã bị phá hủy! Đây là lúc việc sao chép trở nên hữu ích.

Trong Python, khi bạn gán một danh sách cho một biến mới, bạn không tạo ra một danh sách mới. Thay vào đó, bạn tạo ra một tham chiếu mới đến cùng một danh sách. Hãy cùng xem điều này trong thực tế:

original_list = [1, 2, 3, 4, 5]
new_list = original_list

print("Danh sách gốc:", original_list)
print("Danh sách mới:", new_list)

new_list.append(6)

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Danh sách mới sau khi修改 đổi:", new_list)

Kết quả đầu ra:

Danh sách gốc: [1, 2, 3, 4, 5]
Danh sách mới: [1, 2, 3, 4, 5]
Danh sách gốc sau khi修改 đổi: [1, 2, 3, 4, 5, 6]
Danh sách mới sau khi修改 đổi: [1, 2, 3, 4, 5, 6]

Ngạc nhiên chứ? Cả hai danh sách đều thay đổi vì chúng thực sự là cùng một danh sách trong bộ nhớ. Đây là lúc việc sao chép đến cứu giúp!

Sao chép nông trong một danh sách Python

Một bản sao chép nông tạo ra một danh sách mới, nhưng các phần tử trong danh sách mới là các tham chiếu đến cùng các đối tượng trong danh sách gốc. Nó giống như việc làm một bản sao chép photo của danh sách mua sắm của bạn - bạn có một mảnh giấy mới, nhưng các mục viết trên đó vẫn alike.

Hãy xem cách tạo một bản sao chép nông:

import copy

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

print("Danh sách gốc:", original_list)
print("Bản sao chép nông:", shallow_copy)

shallow_copy[1][0] = 'hai'

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Bản sao chép nông sau khi修改 đổi:", shallow_copy)

Kết quả đầu ra:

Danh sách gốc: [1, [2, 3], 4]
Bản sao chép nông: [1, [2, 3], 4]
Danh sách gốc sau khi修改 đổi: [1, ['hai', 3], 4]
Bản sao chép nông sau khi修改 đổi: [1, ['hai', 3], 4]

Chú ý rằng việc thay đổi danh sách con trong bản sao chép nông cũng ảnh hưởng đến danh sách gốc? Điều này là vì danh sách con vẫn là một tham chiếu đến cùng một đối tượng trong bộ nhớ.

Sao chép sâu trong một danh sách Python

Một bản sao chép sâu, ngược lại, tạo ra một danh sách mới và thêm các bản sao của các đối tượng con. Nó giống như việc viết lại toàn bộ danh sách mua sắm của bạn bằng tay - mọi thứ đều mới và độc lập.

Dưới đây là cách tạo một bản sao chép sâu:

import copy

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

print("Danh sách gốc:", original_list)
print("Bản sao chép sâu:", deep_copy)

deep_copy[1][0] = 'hai'

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Bản sao chép sâu sau khi修改 đổi:", deep_copy)

Kết quả đầu ra:

Danh sách gốc: [1, [2, 3], 4]
Bản sao chép sâu: [1, [2, 3], 4]
Danh sách gốc sau khi修改 đổi: [1, [2, 3], 4]
Bản sao chép sâu sau khi修改 đổi: [1, ['hai', 3], 4]

Lần này, việc thay đổi bản sao chép sâu không ảnh hưởng đến danh sách gốc. Nó hoàn toàn độc lập!

Sao chép danh sách bằng cách sử dụng ký hiệu lát cắt

Bây giờ, hãy xem xét một số cách khác để sao chép danh sách. Một trong những phương pháp dễ nhất là sử dụng ký hiệu lát cắt. Nó giống như nói, "Tôi muốn một bản sao của toàn bộ danh sách từ đầu đến cuối."

original_list = [1, 2, 3, 4, 5]
slice_copy = original_list[:]

print("Danh sách gốc:", original_list)
print("Bản sao lát cắt:", slice_copy)

slice_copy.append(6)

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Bản sao lát cắt sau khi修改 đổi:", slice_copy)

Kết quả đầu ra:

Danh sách gốc: [1, 2, 3, 4, 5]
Bản sao lát cắt: [1, 2, 3, 4, 5]
Danh sách gốc sau khi修改 đổi: [1, 2, 3, 4, 5]
Bản sao lát cắt sau khi修改 đổi: [1, 2, 3, 4, 5, 6]

Phương pháp này tạo ra một bản sao chép nông của danh sách, thường đủ cho các danh sách chứa các đối tượng bất biến như số và chuỗi.

Sao chép danh sách bằng cách sử dụng hàm list()

Một cách khác để tạo bản sao là sử dụng hàm list(). Nó giống như nói với Python, "Hãy tạo cho tôi một danh sách mới trông giống như này."

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

print("Danh sách gốc:", original_list)
print("Bản sao danh sách:", list_copy)

list_copy.append(6)

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Bản sao danh sách sau khi修改 đổi:", list_copy)

Kết quả đầu ra:

Danh sách gốc: [1, 2, 3, 4, 5]
Bản sao danh sách: [1, 2, 3, 4, 5]
Danh sách gốc sau khi修改 đổi: [1, 2, 3, 4, 5]
Bản sao danh sách sau khi修改 đổi: [1, 2, 3, 4, 5, 6]

Phương pháp này cũng tạo ra một bản sao chép nông của danh sách.

Sao chép danh sách bằng cách sử dụng phương thức copy()

Cuối cùng, chúng ta có phương thức copy() của danh sách, là phương thức nội tại cho danh sách. Nó giống như danh sách đang nói, "Hãy lấy một bản sao của tôi!"

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

print("Danh sách gốc:", original_list)
print("Phương thức sao chép:", copy_method)

copy_method.append(6)

print("Danh sách gốc sau khi修改 đổi:", original_list)
print("Phương thức sao chép sau khi修改 đổi:", copy_method)

Kết quả đầu ra:

Danh sách gốc: [1, 2, 3, 4, 5]
Phương thức sao chép: [1, 2, 3, 4, 5]
Danh sách gốc sau khi修改 đổi: [1, 2, 3, 4, 5]
Phương thức sao chép sau khi修改 đổi: [1, 2, 3, 4, 5, 6]

Phương pháp này cũng tạo ra một bản sao chép nông của danh sách.

Bây giờ, hãy tóm tắt tất cả các phương pháp này trong một bảng nhỏ:

Phương pháp Cú pháp Loại sao chép Ghi chú
Gán new_list = original_list Tham chiếu Không phải là bản sao thực sự
Sao chép nông copy.copy(original_list) Nông Danh sách mới, cùng tham chiếu đối tượng
Sao chép sâu copy.deepcopy(original_list) Sâu Danh sách mới, tham chiếu đối tượng mới
Ký hiệu lát cắt original_list[:] Nông Dễ hiểu và đọc
Hàm list() list(original_list) Nông Ý định rõ ràng
Phương thức copy() original_list.copy() Nông Phương thức danh sách nội tại

Nhớ rằng, việc chọn phương pháp sao chép phù hợp phụ thuộc vào nhu cầu cụ thể của bạn. Nếu bạn đang làm việc với các danh sách đơn giản chứa các đối tượng bất biến, một bản sao chép nông thường đủ. Nhưng nếu bạn có các danh sách con hoặc các đối tượng có thể thay đổi, bạn có thể cần một bản sao chép sâu để đảm bảo tính độc lập hoàn toàn.

Và thế là xong! Bây giờ bạn đã trang bị kiến thức để sao chép danh sách như một chuyên gia. Lần tới khi bạn cần chia sẻ danh sách mua sắm, bạn sẽ biết chính xác cách để tạo bản sao mà không lo lắng về các thêm vào không mong muốn. Chúc bạn may mắn với lập trình, và hy vọng danh sách của bạn luôn được sao chép hoàn hảo!

Credits: Image by storyset