Python - Sao chép Mảng
Xin chào các bạn, các nhà lập trình Python tài năng! Hôm nay, chúng ta sẽ bơi lội vào thế giới thú vị của việc sao chép mảng trong Python. Là một giáo viên khoa học máy tính hàng xóm thân thiện, tôi rất vui mừng hướng dẫn các bạn trong chuyến hành trình này. Vậy, hãy lấy ly đồ uống yêu thích của bạn, thoải mái ngồi, và hãy cùng nhau bắt đầu cuộc phiêu lưu này!
Hiểu về Mảng trong Python
Trước khi bước vào việc sao chép mảng, hãy nhanh chóng làm tươi lại kiến thức về mảng trong Python của chúng ta. Trong Python, chúng ta thường sử dụng danh sách để biểu diễn mảng. Danh sách linh hoạt và có thể chứa nhiều loại dữ liệu khác nhau.
Dưới đây là một ví dụ đơn giản về danh sách trong Python:
fruits = ["apple", "banana", "cherry"]
print(fruits)
Output:
['apple', 'banana', 'cherry']
Trong ví dụ này, fruits
là danh sách của chúng ta (hoặc mảng) chứa ba phần tử chuỗi.
Bây giờ, hãy khám phá cách chúng ta có thể sao chép các mảng này!
Sao chép Mảng bằng Toán tử Gán
Cách đơn giản nhất để sao chép một mảng có lẽ là sử dụng toán tử gán (=
). Tuy nhiên, phương pháp này có một điều kiện. Hãy xem nó hoạt động như thế nào:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list
print("Original list:", original_list)
print("Copied list:", copied_list)
# Bây giờ, hãy thay đổi danh sách sao chép
copied_list[0] = 100
print("\nAfter modification:")
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]
After modification:
Original list: [100, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
Ngạc nhiên! Khi chúng ta thay đổi copied_list
, original_list
cũng thay đổi! Điều này xảy ra vì toán tử gán không tạo ra danh sách mới. Thay vào đó, cả hai biến đều trỏ đến cùng một mảng trong bộ nhớ. Như là bạn đưa chìa khóa nhà của mình cho một người bạn - họ không nhận được ngôi nhà mới, chỉ có cách truy cập vào ngôi nhà của bạn!
Phương pháp Sao chép Shallow
Để tránh vấn đề này, chúng ta có thể sử dụng các phương pháp sao chép shallow. Những phương pháp này tạo ra danh sách mới, nhưng các phần tử vẫn trỏ đến cùng một đối tượng. Hãy xem một số cách để tạo sao chép shallow:
- Sử dụng phương thức
copy()
:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list.copy()
copied_list[0] = 100
print("Original list:", original_list)
print("Copied list:", copied_list)
Output:
Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
- Sử dụng hàm khởi tạo
list()
:
original_list = [1, 2, 3, 4, 5]
copied_list = list(original_list)
copied_list[0] = 100
print("Original list:", original_list)
print("Copied list:", copied_list)
Output:
Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
- Sử dụng cắt:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list[:]
copied_list[0] = 100
print("Original list:", original_list)
print("Copied list:", copied_list)
Output:
Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
Những phương pháp này hoạt động tốt cho các danh sách đơn giản. Nhưng điều gì xảy ra nếu chúng ta có một danh sách chứa các danh sách con? Đó là lúc chúng ta cần phải lấy ra súng lớn!
Sao chép Mảng bằng Sao chép Sâu
Khi xử lý các danh sách lồng nhau hoặc các đối tượng phức tạp, chúng ta cần sử dụng sao chép sâu. Điều này tạo ra một bản sao hoàn toàn độc lập của mảng gốc, bao gồm tất cả các đối tượng lồng nhau. Như là nhân bản ngôi nhà của bạn và mọi thứ bên trong nó!
Để sử dụng sao chép sâu, chúng ta cần nhập thư viện copy
:
import copy
original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[0][0] = 100
print("Original list:", original_list)
print("Deep copied list:", deep_copied_list)
Output:
Original list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Deep copied list: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]
Như bạn có thể thấy, việc thay đổi danh sách sao chép sâu không ảnh hưởng đến mảng gốc, ngay cả cho các phần tử lồng nhau.
Khi nào nên Sử dụng Sao chép Sâu
Sao chép sâu mạnh mẽ nhưng có chi phí hiệu suất cao. Như là bạn đóng gói toàn bộ ngôi nhà để di chuyển - nó cần nhiều thời gian và nỗ lực hơn! Sử dụng sao chép sâu khi:
- Bạn có các danh sách lồng nhau hoặc các đối tượng phức tạp
- Bạn cần đảm bảo sự độc lập hoàn toàn giữa dữ liệu gốc và dữ liệu sao
- Bạn đang xử lý các đối tượng thay đổi trong danh sách của mình
Tóm tắt các Phương pháp Sao chép
Dưới đây là bảng tóm tắt các phương pháp sao chép mà chúng ta đã thảo luận:
Method | Syntax | Type of Copy | Use Case |
---|---|---|---|
Assignment (= ) |
new_list = old_list |
Reference (No copy) | Khi bạn muốn cả hai biến đều trỏ đến cùng một danh sách |
copy() method |
new_list = old_list.copy() |
Shallow copy | Đối với các danh sách đơn giản với các phần tử không thay đổi |
list() constructor |
new_list = list(old_list) |
Shallow copy | Đối với các danh sách đơn giản với các phần tử không thay đổi |
Slicing | new_list = old_list[:] |
Shallow copy | Đối với các danh sách đơn giản với các phần tử không thay đổi |
copy.deepcopy() |
new_list = copy.deepcopy(old_list) |
Deep copy | Đối với các danh sách lồng nhau hoặc các danh sách với các phần tử thay đổi |
Nhớ rằng, chọn phương pháp sao chép đúng là như chọn công cụ đúng cho công việc. Bạn không thể sử dụng một cây đầu lớn để treo ảnh khung, phải không? Tương tự, sử dụng phương pháp sao chép đơn giản nhất để đáp ứng nhu cầu của bạn.
Kết luận
Xin chúc mừng! Bạn vừa nâng cấp kỹ năng Python của mình bằng cách nắm vững việc sao chép mảng. Từ việc sao chép đơn giản đến sao chép sâu, bạn bây giờ có một bộ công cụ để xử lý các tình huống khác nhau. Nhớ rằng, luyện tập sẽ làm bạn hoàn hảo, vì vậy hãy thử ra các phương pháp này trong dự án của riêng bạn.
Khi chúng ta kết thúc, dưới đây là một chút trò đùa lập trình viên: Lập trình viên nên làm việc sao? Vì không có mảng! ? (Bạn hiểu chứ? Đột phá!)
Hãy tiếp tục lập trình, học hỏi, và nhất quán là hãy có niềm vui với Python!
Credits: Image by storyset