GIST cần thực hiện là: Xử lý các danh sách nông (không có danh sách phụ, chỉ các yếu tố đơn lẻ) bằng cách sử dụng "phân công bình thường" làm tăng "hiệu ứng phụ" khi bạn tạo một danh sách nông và sau đó bạn tạo một bản sao của danh sách này bằng cách sử dụng "phân công bình thường" . "Hiệu ứng phụ" này là khi bạn thay đổi bất kỳ yếu tố nào trong danh sách sao chép được tạo, bởi vì nó sẽ tự động thay đổi các yếu tố tương tự của danh sách gốc. Đó là khicopy
có ích, vì nó sẽ không thay đổi các thành phần danh sách ban đầu khi thay đổi các thành phần sao chép.
Mặt khác, copy
cũng có "tác dụng phụ", khi bạn có một danh sách có danh sách trong đó (danh sách phụ) và deepcopy
giải quyết nó. Chẳng hạn, nếu bạn tạo một danh sách lớn có các danh sách lồng nhau trong đó (danh sách phụ) và bạn tạo một bản sao của danh sách lớn này (danh sách gốc). "Hiệu ứng phụ" sẽ phát sinh khi bạn sửa đổi danh sách phụ của danh sách sao chép sẽ tự động sửa đổi danh sách phụ của danh sách lớn. Đôi khi (trong một số dự án) bạn muốn giữ danh sách lớn (danh sách ban đầu của bạn) vì nó không có sửa đổi, và tất cả những gì bạn muốn là tạo một bản sao của các yếu tố của nó (danh sách phụ). Vì vậy, giải pháp của bạn là sử dụng deepcopy
sẽ xử lý "tác dụng phụ" này và tạo một bản sao mà không sửa đổi nội dung gốc.
Các hành vi copy
và deep copy
hoạt động khác nhau chỉ liên quan đến các đối tượng hỗn hợp (ví dụ: các đối tượng có chứa các đối tượng khác như danh sách).
Dưới đây là những khác biệt được minh họa trong ví dụ mã đơn giản này:
Đầu tiên
hãy kiểm tra cách copy
hành xử (nông), bằng cách tạo danh sách gốc và bản sao của danh sách này:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Bây giờ, hãy chạy một số print
thử nghiệm và xem danh sách ban đầu hoạt động như thế nào so với danh sách sao chép của nó:
original_list và copy_list có địa chỉ khác nhau
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
các phần tử của original_list và copy_list có cùng địa chỉ
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements của original_list và copy_list có cùng địa chỉ
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
sửa đổi các phần tử gốc_list KHÔNG sửa đổi các phần tử copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
sửa đổi các phần tử copy_list KHÔNG sửa đổi các phần tử gốc_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
sửa đổi sub_elements gốc_list tự động sửa đổi copy_list sub_elements
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
sửa đổi copy_list sub_elements tự động sửa đổi sub_elements gốc_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
Thứ hai
hãy kiểm tra cách deepcopy
ứng xử, bằng cách thực hiện tương tự như chúng tôi đã làm copy
(tạo danh sách gốc và bản sao của danh sách này):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Bây giờ, hãy chạy một số print
thử nghiệm và xem danh sách ban đầu hoạt động như thế nào so với danh sách sao chép của nó:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list và copy_list có địa chỉ khác nhau
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
các phần tử của original_list và copy_list có cùng địa chỉ
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements của original_list và copy_list có địa chỉ khác nhau
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
sửa đổi các phần tử gốc_list KHÔNG sửa đổi các phần tử copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
sửa đổi các phần tử copy_list KHÔNG sửa đổi các phần tử gốc_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
sửa đổi sub_elements gốc_list KHÔNG sửa đổi copy_list sub_elements
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
sửa đổi copy_list sub_elements KHÔNG sửa đổi sub_elements gốc_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]