copy --- Hoạt động sao chép nông và sâu¶
Source code: Lib/copy.py
Các câu lệnh gán trong Python không sao chép các đối tượng, chúng tạo ra các liên kết giữa mục tiêu và đối tượng. Đối với các bộ sưu tập có thể thay đổi hoặc chứa các mục có thể thay đổi, đôi khi cần có một bản sao để người ta có thể thay đổi một bản sao mà không thay đổi bản sao kia. Mô-đun này cung cấp các thao tác sao chép nông và sâu chung (được giải thích bên dưới).
Tóm tắt giao diện:
- copy.copy(obj)¶
Trả lại bản sao nông của obj.
- copy.deepcopy(obj[, memo])¶
Trả lại bản sao sâu của obj.
- copy.replace(obj, /, **changes)¶
Tạo một đối tượng mới cùng loại với obj, thay thế các trường bằng các giá trị từ changes.
Added in version 3.13.
- exception copy.Error¶
Tăng lên cho các lỗi cụ thể của mô-đun.
Sự khác biệt giữa sao chép nông và sao chép sâu chỉ liên quan đến các đối tượng phức hợp (đối tượng chứa các đối tượng khác, như danh sách hoặc thể hiện của lớp):
Một shallow copy xây dựng một đối tượng ghép mới và sau đó (trong phạm vi có thể) chèn references vào đó với các đối tượng được tìm thấy trong bản gốc.
Một deep copy xây dựng một đối tượng phức hợp mới và sau đó, theo cách đệ quy, chèn copies vào đó các đối tượng được tìm thấy trong bản gốc.
Hai vấn đề thường tồn tại với các thao tác sao chép sâu mà không tồn tại với các thao tác sao chép nông:
Các đối tượng đệ quy (các đối tượng phức hợp trực tiếp hoặc gián tiếp chứa tham chiếu đến chính chúng) có thể gây ra vòng lặp đệ quy.
Bởi vì bản sao sâu sao chép mọi thứ nên nó có thể sao chép quá nhiều, chẳng hạn như dữ liệu được chia sẻ giữa các bản sao.
Hàm deepcopy() tránh được những vấn đề này bằng cách:
giữ một từ điển
memocủa các đối tượng đã được sao chép trong quá trình sao chép hiện tại; vàcho phép các lớp do người dùng định nghĩa ghi đè thao tác sao chép hoặc tập hợp các thành phần được sao chép.
Mô-đun này không sao chép các loại như mô-đun, phương thức, dấu vết ngăn xếp, khung ngăn xếp, tệp, ổ cắm, cửa sổ hoặc bất kỳ loại tương tự nào. Nó thực hiện "sao chép" các hàm và lớp (nông và sâu), bằng cách trả về đối tượng ban đầu không thay đổi; điều này tương thích với cách chúng được xử lý bởi mô-đun pickle.
Có thể tạo các bản sao nông của từ điển bằng cách sử dụng dict.copy() và danh sách bằng cách gán một phần của toàn bộ danh sách, ví dụ: copied_list = original_list[:].
Các lớp có thể sử dụng cùng một giao diện để kiểm soát việc sao chép mà chúng sử dụng để kiểm soát quá trình tẩy. Xem mô tả mô-đun pickle để biết thông tin về các phương pháp này. Trên thực tế, mô-đun copy sử dụng các chức năng dưa chua đã đăng ký từ mô-đun copyreg.
Để một lớp xác định cách thực hiện sao chép của riêng mình, nó có thể định nghĩa các phương thức đặc biệt __copy__() và __deepcopy__().
- object.__copy__(self)¶
Được gọi để thực hiện thao tác sao chép nông; không có đối số bổ sung nào được thông qua.
- object.__deepcopy__(self, memo)¶
Được gọi để thực hiện thao tác sao chép sâu; nó được truyền một đối số, từ điển memo. Nếu quá trình triển khai
__deepcopy__cần tạo bản sao sâu của một thành phần thì nó phải gọi hàmdeepcopy()với thành phần đó làm đối số đầu tiên và từ điển memo làm đối số thứ hai. Từ điển memo phải được coi là một đối tượng mờ đục.
Hàm copy.replace() bị hạn chế hơn so với copy() và deepcopy() và chỉ hỗ trợ các bộ dữ liệu có tên được tạo bởi namedtuple(), dataclasses và các lớp khác xác định phương thức __replace__().
- object.__replace__(self, /, **changes)¶
Phương thức này sẽ tạo một đối tượng mới cùng loại, thay thế các trường bằng các giá trị từ changes.
Added in version 3.13.
Xem thêm
- Mô-đun
pickle Thảo luận về các phương pháp đặc biệt được sử dụng để hỗ trợ việc truy xuất và khôi phục trạng thái đối tượng.