Sao chép thể hiện của lớp python

Trong Python, các câu lệnh Chuyển nhượng 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. Khi chúng ta sử dụng toán tử =, Nó chỉ tạo một biến mới chia sẻ tham chiếu của đối tượng ban đầu. Để tạo “bản sao thực” hoặc “bản sao” của các đối tượng này, chúng ta có thể sử dụng module copy trong Python

Cú pháp của Deep copy

cú pháp. sao chép. bản sao sâu(x)

Cú pháp của Shallow copy

cú pháp. sao chép. sao chép(x)

Thí dụ

Để tạo các bản sao này, chúng tôi sử dụng mô-đun sao chép. copy() trả về một bản sao nông của danh sách và deepcopy() trả về một bản sao sâu của danh sách. Như bạn có thể thấy rằng cả hai đều có cùng giá trị nhưng có ID khác nhau

Python3




The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
0

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
1
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
2

 

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
3

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
4
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
5
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
6_______00
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
1
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
2
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
3
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
4
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
1
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
6
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
7
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
8
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
9

của các đối tượng, chúng chỉ liên kết tên với một đối tượng. Đối với các đối tượng bất biến, điều đó thường không tạo ra sự khác biệt

Nhưng để làm việc với các đối tượng có thể thay đổi hoặc bộ sưu tập các đối tượng có thể thay đổi, bạn có thể đang tìm cách tạo “bản sao thực” hoặc “bản sao” của các đối tượng này

Về cơ bản, đôi khi bạn sẽ muốn các bản sao mà bạn có thể sửa đổi mà không tự động sửa đổi bản gốc cùng một lúc. Trong bài viết này, tôi sẽ cung cấp cho bạn tóm tắt về cách sao chép hoặc “nhân bản” các đối tượng trong Python 3 và một số cảnh báo liên quan

Ghi chú. Hướng dẫn này được viết dành cho Python 3 nhưng có một chút khác biệt giữa Python 2 và 3 khi nói đến việc sao chép các đối tượng. Khi có sự khác biệt, tôi sẽ chỉ ra chúng trong văn bản

Hãy bắt đầu bằng cách xem cách sao chép các bộ sưu tập có sẵn của Python. Có thể sao chép các bộ sưu tập có thể thay đổi được tích hợp sẵn của Python như danh sách, ký tự và bộ bằng cách gọi các hàm xuất xưởng của chúng trên một bộ sưu tập hiện có

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
0

Tuy nhiên, phương pháp này sẽ không hoạt động đối với các đối tượng tùy chỉnh và trên hết, nó chỉ tạo các bản sao nông. Đối với các đối tượng phức hợp như danh sách, ký tự và tập hợp, có một sự khác biệt quan trọng giữa sao chép nông và sâu

  • Một bản sao nông có nghĩa là xây dựng một đối tượng bộ sưu tập mới và sau đó đưa vào đó các tham chiếu đến các đối tượng con được tìm thấy trong bản gốc. Thực chất phó bản nông chỉ sâu một bậc. Quá trình sao chép không lặp lại và do đó sẽ không tạo bản sao của chính các đối tượng con

  • Một bản sao sâu làm cho quá trình sao chép trở nên đệ quy. Nó có nghĩa là đầu tiên xây dựng một đối tượng bộ sưu tập mới và sau đó điền đệ quy nó với các bản sao của các đối tượng con được tìm thấy trong bản gốc. Sao chép một đối tượng theo cách này sẽ đi qua toàn bộ cây đối tượng để tạo ra một bản sao hoàn toàn độc lập của đối tượng ban đầu và tất cả các phần tử con của nó

Tôi biết, đó là một chút của một ngụm. Vì vậy, hãy xem xét một số ví dụ để hiểu rõ sự khác biệt giữa các bản sao sâu và nông

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

Tạo bản sao nông

Trong ví dụ bên dưới, chúng ta sẽ tạo một danh sách lồng nhau mới và sau đó sao chép sơ qua nó bằng hàm xuất xưởng

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
17

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
1

Điều này có nghĩa là

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18 bây giờ sẽ là một đối tượng mới và độc lập với cùng nội dung như
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19. Bạn có thể xác minh điều này bằng cách kiểm tra cả hai đối tượng

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
5

Để khẳng định

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18 có thực sự độc lập với bản gốc hay không, hãy làm một thí nghiệm nhỏ. Bạn có thể thử thêm một danh sách con mới vào bản gốc (
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19) và sau đó kiểm tra để đảm bảo rằng sửa đổi này không ảnh hưởng đến bản sao (
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18)

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
9

Như bạn có thể thấy, điều này có tác dụng như mong đợi. Việc sửa đổi danh sách đã sao chép ở mức độ “hời hợt” hoàn toàn không có vấn đề gì

Tuy nhiên, vì chúng ta chỉ tạo một bản sao nông của danh sách ban đầu, nên

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18 vẫn chứa các tham chiếu đến các đối tượng con ban đầu được lưu trữ trong
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19

Những đứa trẻ này không được sao chép. Chúng chỉ được tham chiếu lại trong danh sách đã sao chép

Do đó, khi bạn sửa đổi một trong các đối tượng con trong

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19, sửa đổi này cũng sẽ được phản ánh trong
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18—đó là vì cả hai danh sách đều chia sẻ cùng một đối tượng con. Phó bản chỉ là nông, phó bản sâu một cấp

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
4

Trong ví dụ trên, chúng tôi (dường như) chỉ thực hiện thay đổi thành

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19. Nhưng hóa ra cả hai danh sách phụ ở chỉ mục 1 trong
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19 và
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
18 đều đã được sửa đổi. Một lần nữa, điều này xảy ra bởi vì chúng tôi chỉ tạo một bản sao nông của danh sách gốc

Nếu chúng ta tạo một bản sao sâu của

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19 trong bước đầu tiên, thì cả hai đối tượng sẽ hoàn toàn độc lập. Đây là sự khác biệt thực tế giữa các bản sao nông và sâu của các đối tượng

Bây giờ bạn đã biết cách tạo các bản sao nông của một số lớp bộ sưu tập tích hợp sẵn và bạn biết sự khác biệt giữa sao chép nông và sâu. Những câu hỏi chúng tôi vẫn muốn câu trả lời là

  • Làm cách nào bạn có thể tạo các bản sao sâu của các bộ sưu tập cài sẵn?
  • Làm cách nào bạn có thể tạo các bản sao (nông và sâu) của các đối tượng tùy ý, bao gồm các lớp tùy chỉnh?

Câu trả lời cho những câu hỏi này nằm trong mô-đun

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91 trong thư viện chuẩn Python. Mô-đun này cung cấp một giao diện đơn giản để tạo các bản sao nông và sâu của các đối tượng Python tùy ý

Loại bỏ các quảng cáo

Tạo bản sao sâu

Hãy lặp lại ví dụ sao chép danh sách trước đó, nhưng với một điểm khác biệt quan trọng. Thay vào đó, lần này chúng ta sẽ tạo một bản sao sâu bằng cách sử dụng hàm

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
92 được xác định trong mô-đun
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
2

Khi bạn kiểm tra

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19 và bản sao của nó
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
95 mà chúng tôi đã tạo bằng
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
96, bạn sẽ thấy rằng cả hai trông giống hệt nhau một lần nữa—giống như trong ví dụ trước

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
6

Tuy nhiên, nếu bạn sửa đổi một trong các đối tượng con trong đối tượng ban đầu (

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19), bạn sẽ thấy rằng sửa đổi này sẽ không ảnh hưởng đến bản sao sâu (
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
95)

Cả hai đối tượng, bản gốc và bản sao, lần này hoàn toàn độc lập.

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
19 được sao chép đệ quy, bao gồm tất cả các đối tượng con của nó

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
0

Bạn có thể muốn dành chút thời gian để ngồi xuống với trình thông dịch Python và xem qua các ví dụ này ngay bây giờ. Việc sao chép các đối tượng sẽ dễ dàng hơn khi bạn trực tiếp trải nghiệm và chơi với các ví dụ

Nhân tiện, bạn cũng có thể tạo các bản sao nông bằng một hàm trong mô-đun

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91. Hàm
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
41 tạo bản sao nông của đối tượng

Điều này hữu ích nếu bạn cần thông báo rõ ràng rằng bạn đang tạo một bản sao nông ở đâu đó trong mã của mình. Sử dụng

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
41 cho phép bạn chỉ ra thực tế này. Tuy nhiên, đối với các bộ sưu tập tích hợp, nó được coi là Pythonic hơn khi chỉ sử dụng các hàm list, dict và set factory để tạo các bản sao nông

Sao chép các đối tượng Python tùy ý

Câu hỏi chúng ta vẫn cần trả lời là làm cách nào để tạo các bản sao (nông và sâu) của các đối tượng tùy ý, bao gồm các lớp tùy chỉnh. Bây giờ chúng ta hãy xem xét điều đó

Một lần nữa mô-đun

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91 đến để giải cứu chúng tôi. Các hàm
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
41 và
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
96 của nó có thể được sử dụng để sao chép bất kỳ đối tượng nào

Một lần nữa, cách tốt nhất để hiểu cách sử dụng chúng là làm một thí nghiệm đơn giản. Tôi sẽ dựa trên ví dụ sao chép danh sách trước đó. Hãy bắt đầu bằng cách định nghĩa một lớp điểm 2D đơn giản

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
7

Tôi hy vọng bạn đồng ý rằng điều này là khá đơn giản. Tôi đã thêm một triển khai

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
46 để chúng ta có thể dễ dàng kiểm tra các đối tượng được tạo từ lớp này trong trình thông dịch Python

Ghi chú. Ví dụ trên sử dụng Python 3. 6 chuỗi f để xây dựng chuỗi được trả về bởi

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
47. Trên Python 2 và các phiên bản Python 3 trước 3. 6, bạn sẽ sử dụng một biểu thức định dạng chuỗi khác, chẳng hạn

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
0

Tiếp theo, chúng ta sẽ tạo một phiên bản

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
48 và sau đó sao chép (một cách nông cạn) nó, sử dụng mô-đun
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
10

Nếu chúng tôi kiểm tra nội dung của đối tượng

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
48 ban đầu và bản sao (nông) của nó, chúng tôi sẽ thấy những gì chúng tôi mong đợi

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
11

Đây là một cái gì đó khác để ghi nhớ. Bởi vì đối tượng điểm của chúng ta sử dụng các kiểu bất biến (int) cho tọa độ của nó, nên không có sự khác biệt giữa bản sao nông và sâu trong trường hợp này. Nhưng tôi sẽ mở rộng ví dụ sau

Hãy chuyển sang một ví dụ phức tạp hơn. Tôi sẽ định nghĩa một lớp khác để biểu diễn các hình chữ nhật 2D. Tôi sẽ làm điều đó theo cách cho phép chúng ta tạo ra một hệ thống phân cấp đối tượng phức tạp hơn—các hình chữ nhật của tôi sẽ sử dụng các đối tượng

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
48 để thể hiện tọa độ của chúng

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
12

Một lần nữa, đầu tiên chúng ta sẽ cố gắng tạo một bản sao nông của một thể hiện hình chữ nhật

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
13

Nếu bạn kiểm tra hình chữ nhật ban đầu và bản sao của nó, bạn sẽ thấy tính năng ghi đè

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
46 hoạt động tốt như thế nào và quy trình sao chép nông hoạt động như mong đợi

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
14

Hãy nhớ ví dụ về danh sách trước đã minh họa sự khác biệt giữa các bản sao sâu và nông như thế nào? . Tôi sẽ sửa đổi một đối tượng sâu hơn trong hệ thống phân cấp đối tượng, sau đó bạn sẽ thấy thay đổi này cũng được phản ánh trong bản sao (nông)

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
15

Tôi hy vọng điều này hành xử như bạn mong đợi nó. Tiếp theo, tôi sẽ tạo một bản sao sâu của hình chữ nhật ban đầu. Sau đó, tôi sẽ áp dụng một sửa đổi khác và bạn sẽ thấy đối tượng nào bị ảnh hưởng

>>>

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
16

thì đấy. Lần này bản sao sâu (

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
23) hoàn toàn độc lập với bản gốc (
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
24) và bản sao nông (
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
25)

Chúng tôi đã đề cập rất nhiều điều ở đây và vẫn còn một số điểm tốt hơn để sao chép các đối tượng

Nó trả tiền để đi sâu (ha. ) về chủ đề này, vì vậy bạn có thể muốn nghiên cứu tài liệu về mô-đun

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
91. Ví dụ: các đối tượng có thể kiểm soát cách chúng được sao chép bằng cách xác định các phương thức đặc biệt
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
27 và
The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4 
28 trên chúng

Loại bỏ các quảng cáo

3 điều cần nhớ

  • Tạo một bản sao nông của một đối tượng sẽ không sao chép các đối tượng con. Vì vậy, bản sao không hoàn toàn độc lập với bản gốc
  • Một bản sao sâu của một đối tượng sẽ sao chép đệ quy các đối tượng con. Bản sao hoàn toàn độc lập với bản gốc, nhưng việc tạo bản sao sâu sẽ chậm hơn
  • Bạn có thể sao chép các đối tượng tùy ý (bao gồm cả các lớp tùy chỉnh) bằng mô-đun
    The original elements before deep copying
    1 2 [3, 5] 4 
    The new list of elements after deep copying 
    1 2 [7, 5] 4 
    The original elements after deep copying
    1 2 [3, 5] 4 
    91

Nếu bạn muốn tìm hiểu sâu hơn về các kỹ thuật lập trình Python cấp trung cấp khác, hãy xem phần thưởng miễn phí này

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Sao chép thể hiện của lớp python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Dan Bader

Sao chép thể hiện của lớp python
Sao chép thể hiện của lớp python

Dan Bader là chủ sở hữu và tổng biên tập của Real Python và là nhà phát triển chính của realpython. nền tảng học tập com. Dan đã viết mã hơn 20 năm và có bằng thạc sĩ về khoa học máy tính

» Thông tin thêm về Đan

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng các chuyên gia Pythonistas

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể sao chép một thể hiện của một lớp trong Python không?

Có, bạn có thể sử dụng bản sao. bản sao sâu . vì vậy chỉ cần c2 = sao chép.

Một thể hiện của hoặc một bản sao của một lớp là gì?

Một thể hiện của lớp là một đối tượng . Nó còn được gọi là một đối tượng lớp hoặc thể hiện của lớp. Như vậy, khởi tạo có thể được gọi là xây dựng. Bất cứ khi nào các giá trị thay đổi từ đối tượng này sang đối tượng khác, chúng được gọi là biến thể hiện.

Bản sao () có phải là bản sao sâu không?

copy() tạo bản sao nông của đối tượng.

Bản sao () là bản sao nông hay sâu?

Sự khác biệt giữa Bản sao nông và sâu của một lớp