Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Thao tác Sao chép nông (Shallow Copy) và sâu (Deep Copy) trong Python

Trong Python có một module gọi là copy. Sử dụng module này, ta có thể thực hiện deep copy (sao chép sâu) và shallow copy (sao chép nông). Trong Python, câu lệnh gán (assignment) không sao chép đối tượng. Chúng tạo ra một liên kết (binding) giữa target và đối tượng chính.

Để dùng module này, nên nhập bằng:

import copy

Phương thức copy.copy(x)

Tạo một shallow copy (sao chép nông) của đối tượng x. Đối với shallow copy, một tham chiếu (reference) của đối tượng được sao chép sang đối tượng khác. Vì vậy, nếu có bất kỳ thay đổi nào trên tham chiếu đã sao chép, nó sẽ thay đổi nội dung của đối tượng chính.

Phương thức copy.deepcopy(x)

Tạo một deep copy (sao chép sâu) của đối tượng x. Đối với deep copy, một đối tượng riêng biệt được tạo bằng cách lấy dữ liệu từ đối tượng chính. Vì vậy, nếu có thay đổi trên tham chiếu đã sao chép, đối tượng chính sẽ giữ nguyên.

Mã ví dụ

import copy

my_mat = [[11,22,33],[44,55,66],[11,22,33]]
print('Ma trận trước cập nhật: ' + str(my_mat))

new_mat = copy.copy(my_mat)  # Shallow copy và cập nhật trên đối tượng sao chép
new_mat[2][0] = 77
new_mat[2][1] = 88
new_mat[2][2] = 99
print('Ma trận sau cập nhật: ' + str(my_mat))  # Ma trận gốc bị thay đổi

my_mat = [[11,22,33],[44,55,66],[11,22,33]]
new_mat_deep = copy.deepcopy(new_mat)  # Deep copy
print('\nMa trận trước cập nhật: ' + str(my_mat))
new_mat_deep[2][0] = 77
new_mat_deep[2][1] = 88
new_mat_deep[2][2] = 99
print('Ma trận sau cập nhật: ' + str(my_mat))  # Ma trận gốc KHÔNG thay đổi
print('Ma trận mới: ' + str(new_mat_deep))  # Ma trận mới

Kết quả

Ma trận trước cập nhật: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
Ma trận sau cập nhật: [[11, 22, 33], [44, 55, 66], [77, 88, 99]]
Ma trận trước cập nhật: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
Ma trận sau cập nhật: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
Ma trận mới: [[11, 22, 33], [44, 55, 66], [77, 88, 99]]