Page 156 - Em Học Python
P. 156
Quái lạ. Mình chỉ sửa mỗi ở bên mảng my_animals thôi mà? Sao cả hai mảng lại đều
bị thay đổi thế này?
Đó là do hàm copy thực ra chỉ tạo ra một bản sao chép sơ bộ ⟨shallow copy⟩ , tức là nó
không sao chép các đối tượng nằm bên trong đối tượng được sao chép. Ở đây ta đã sao
chép đối tượng chính là mảng chứ không phải là các phần tử riêng biệt bên trong nó. Vậy
cho nên cuối cùng ta có một mảng mới nhưng lại không có các phần tử mới — mảng
more_animals có y nguyên ba phần tử cũ trong nó.
Tương tự như vậy, nếu ta thêm một con nữa vào mảng gốc ( my_animals), nó sẽ
không xuất hiện trong mảng mới đâu ( more_animals). Chứng minh nhé, hiển thị ra độ dài
của mảng sau khi thêm vào là biết ngay:
>>> sally = Animal('sphinx', 4, 'sand')
>>> my_animals.append(sally)
>>> print(len(my_animals))
4
>>> print(len(more_animals))
3
Em thấy đấy, khi thêm một phần tử mới vào mảng gốc my_animals, nó không được
tự thêm vào mảng kia more_animals. Khi dùng hàm len và hiển thị ra kết quả, mảng thứ
nhất có bốn phần tử còn mảng thứ hai chỉ có ba thôi.
Một hàm khác trong module copy là deepcopy, có thể tạo ra bản sao của tất cả các
đối tượng nằm bên trong đối tượng được sao chép. Nếu dùng deepcopy để sao chép
my_animals, ta sẽ có một mảng hoàn toàn mới với bản sao mới của tất cả các phần tử bên
trong nó. Kết quả là, thay đổi ở bên trong các đối tượng Animal gốc không ảnh hưởng gì đến
mảng mới hết. Ví dụ đây:
>>> more_animals = copy.deepcopy(my_animals)
>>> my_animals[0].species = 'wyrm'
>>> print(my_animals[0].species)
wyrm
130 Chương 10