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
                  ​
   151   152   153   154   155   156   157   158   159   160   161