Hướng dẫn what is a deep copy in python? - một bản sao sâu trong python là gì?

Mã nguồn: lib/copy.py 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 ràng buộc 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 một bản sao là cần thiết để người ta có thể thay đổi một bản sao mà không thay đổi cái kia. Mô -đun này cung cấp các hoạt động sao chép nông và sâu chung (giải thích bên dưới).

Tóm tắt giao diện:

sao chép.Copy (x) ¶copy(x)

Trả lại một bản sao nông của x.

sao chép.deepcopy (x [, memo]) ¶deepcopy(x[, memo])

Trả lại một bản sao sâu của x.

ExceptionCopy.error¶ copy.Error

Được nâ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à sâu chỉ có liên quan đến các đối tượng hỗn hợp (các đối tượng có chứa các đối tượng khác, như danh sách hoặc trường hợp lớp):

  • Một bản sao nông xây dựng một đối tượng hợp chất mới và sau đó (trong phạm vi có thể) chèn các tham chiếu vào nó vào các đối tượng được tìm thấy trong bản gốc.

  • Một bản sao sâu xây dựng một đối tượng hợp chất mới và sau đó, đệ quy, chèn các bản sao vào nó của 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 hoạt động sao chép sâu mà don lồng tồn tại với các hoạt động sao chép nông:

  • Các đối tượng đệ quy (các đối tượng hợp chất, trực tiếp hoặc gián tiếp, chứa một tham chiếu đến chính chúng) có thể gây ra một vòng lặp đệ quy.

  • Bởi vì bản sao sâu sao chép mọi thứ mà nó có thể sao chép quá nhiều, chẳng hạn như dữ liệu dự định được chia sẻ giữa các bản sao.

Hàm deepcopy() tránh những vấn đề này bằng cách:

  • Giữ một từ điển memo củ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 xác định ghi đè hoạt động 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ó không sao chép các chức năng và các 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ằng mô -đun pickle.

Các bản sao nông của từ điển có thể được thực hiện bằng cách sử dụng dict.copy() và các danh sách bằng cách gán một lát của toàn bộ danh sách, ví dụ, copied_list = original_list[:].

Các lớp có thể sử dụng các giao diện tương tự để kiểm soát sao chép mà họ sử dụng để kiểm soát Pickling. Xem mô tả của 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 hàm Pickle đã đăng ký từ 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 
0.

Để một lớp xác định triển khai bản sao của riêng mình, nó có thể 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 
1 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 
2. Cái trước được gọi để thực hiện hoạt động sao chép nông; Không có lập luận bổ sung được thông qua. Cái sau được gọi để thực hiện hoạt động sao chép sâu; Nó được thông qua một đối số, từ điển memo. Nếu việc 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 
2 cần tạo một bản sao sâu của một thành phần, nó sẽ gọi hàm deepcopy() với thành phần là đối số đầu tiên và từ điển ghi nhớ là đối số thứ hai. Từ điển ghi nhớ nên được coi là một đối tượng mờ đục.

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ợ truy xuất và phục hồi trạng thái đối tượng.

Trong Python, các câu lệnh gán không sao chép các đối tượng, chúng tạo ra các ràng buộc 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 gốc. Để tạo ra các bản sao thực tế của người Viking, hoặc các bản sao của các đối tượng này, chúng ta có thể sử dụng mô -đun sao chép trong Python.= operator, It only creates a new variable that shares the reference of the original object. In order to create “real copies” or “clones” of these objects, we can use the copy module in Python.

Cú pháp của bản sao sâu

Cú pháp: copy.deepcopy (x) copy.deepcopy(x)

Cú pháp của bản sao nông

Cú pháp: copy.copy (x)copy.copy(x)

Example:

Để tạo các bản sao này, chúng tôi sử dụng mô -đun sao chép. Bản sao () 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 một 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 
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
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
1
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
2223
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
4
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
5
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
6
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
3
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
8
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
9deepcopy()0deepcopy()1

deepcopy()2

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0 deepcopy()4

deepcopy()5deepcopy()6deepcopy()7

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
3deepcopy()9memo0memo1memo2

memo3

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0 memo5

deepcopy()5deepcopy()6memo8

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
3deepcopy()9pickle1memo1pickle3

Output:

li2 ID:  2521878674624 Value:  [1, 2, [3, 5], 4]
li3 ID:  2521878676160 Value:  [1, 2, [3, 5], 4]

Bản sao sâu trong Python là gì?

Một bản sao sâu tạo ra một đối tượng hợp chất mới trước khi chèn các bản sao của các mục được tìm thấy trong bản gốc vào nó theo cách đệ 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 đó chiếm giữ nó một cách đệ quy 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. Trong trường hợp sao chép sâu, một bản sao của đối tượng được sao chép vào một đối tượng khác. Điều đó có nghĩa là bất kỳ thay đổi nào được thực hiện đối với một bản sao của đối tượng không phản ánh trong đối tượng gốc. & NBSP;any changes made to a copy of the object do not reflect in the original object. 

Hướng dẫn what is a deep copy in python? - một bản sao sâu trong python là gì?

Example:

Trong ví dụ trên, sự thay đổi được thực hiện trong danh sách không ảnh hưởng đến các danh sách khác, cho thấy danh sách được sao chép sâu. & nbsp;did not affect other lists, indicating the list is deeply copied.  

Python

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
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
1
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
2223
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
4
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
5
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
6
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
3
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
8
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
9deepcopy()0deepcopy()1

deepcopy()2

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0 deepcopy()4

memo3

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0 memo5

Bản sao sâu trong Python là gì?

pickle5deepcopy()5 pickle7

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0pickle9__

deepcopy()5deepcopy()6copy3copied_list = original_list[:]5

Một bản sao sâu tạo ra một đối tượng hợp chất mới trước khi chèn các bản sao của các mục được tìm thấy trong bản gốc vào nó theo cách đệ 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 đó chiếm giữ nó một cách đệ quy 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. Trong trường hợp sao chép sâu, một bản sao của đối tượng được sao chép vào một đối tượng khác. Điều đó có nghĩa là bất kỳ thay đổi nào được thực hiện đối với một bản sao của đối tượng không phản ánh trong đối tượng gốc. & NBSP;

copied_list = original_list[:]6 copied_list = original_list[:]77__78

Trong ví dụ trên, sự thay đổi được thực hiện trong danh sách không ảnh hưởng đến các danh sách khác, cho thấy danh sách được sao chép sâu. & nbsp;

deepcopy()5deepcopy()6copy3copied_list = original_list[:]5

Python

copied_list = original_list[:]6 copied_list = original_list[:]77__78

pickle5deepcopy()5 pickle7

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0pickle9__

Output:

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 

Bài viết được đề xuất - Sự khác biệt giữa bản sao nông và sâu của một lớp

Bản sao sâu trong Python là gì?any changes made to a copy of an object do reflect in the original object. In python, this is implemented using the “copy()” function. 

Hướng dẫn what is a deep copy in python? - một bản sao sâu trong python là gì?

Example:

Trong ví dụ này, sự thay đổi được thực hiện trong danh sách đã ảnh hưởng đến một danh sách khác, cho thấy danh sách được sao chép nông. Điểm quan trọng: Sự khác biệt giữa sao chép nông và sâu chỉ có liên quan đến các đối tượng hợp chất (các đối tượng có chứa các đối tượng khác, như danh sách hoặc trường hợp lớp):did affect another list, indicating the list is shallowly copied. Important Points: The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):

  • Một bản sao nông xây dựng một đối tượng hợp chất mới và sau đó (trong phạm vi có thể) chèn các tham chiếu vào nó vào các đối tượng được tìm thấy trong bản gốc.
  • Một bản sao sâu xây dựng một đối tượng hợp chất mới và sau đó, đệ quy, chèn các bản sao vào nó của các đối tượng được tìm thấy trong bản gốc.

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 
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
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
1
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
2223
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
4
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
5
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
6dict.copy()444428
The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
9____________deepcopy()1

deepcopy()2

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0 deepcopy()4

deepcopy()5 deepcopy()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 
64copied_list = original_list[:]5

copied_list = original_list[:]6 copied_list = original_list[:]77__78

pickle5deepcopy()5 pickle7

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0pickle9__

deepcopy()5deepcopy()6copy3copied_list = original_list[:]5

deepcopy()5 deepcopy()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 
94copied_list = original_list[:]5

copied_list = original_list[:]6 copied_list = original_list[:]77__78

pickle5deepcopy()5 pickle7

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 
0pickle9__

Output:

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4 

Difference between Shallow and Deep copy of a class


Bản sao sâu trong Python là gì?

Bản sao sâu trong Python là gì? Một bản sao sâu tạo ra một đối tượng hợp chất mới trước khi chèn các bản sao của các mục được tìm thấy trong bản gốc vào nó theo cách đệ 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 đó chiếm giữ nó một cách đệ quy 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.creates a new compound object before inserting copies of the items found in the original into it in a recursive manner. It means first constructing a new collection object and then recursively populating it with copies of the child objects found in the original.

Bản sao sâu là gì?

Một bản sao sâu của một đối tượng là một bản sao có thuộc tính không chia sẻ cùng các tài liệu tham khảo (chỉ ra các giá trị cơ bản giống nhau) như của đối tượng nguồn mà bản sao được tạo.a copy whose properties do not share the same references (point to the same underlying values) as those of the source object from which the copy was made.

Bản sao sâu trong Python MCQ là gì?

Bản sao sâu là một quá trình trong đó quá trình sao chép diễn ra đệ quy.Do đó, việc sửa đổi được thực hiện trong một danh sách không ảnh hưởng đến danh sách khác.3. Trong _____________ Sao chép, địa chỉ cơ sở của các đối tượng được sao chép.a process where the copying process takes place recursively. Hence the modification done on one list does not affect the other list. 3. In _______________ copy, the base address of the objects are copied.

Là bản sao danh sách Python sao chép sâu?

Bản sao Python.Phương thức Copy () đã tạo một bản sao thực sự của danh sách ban đầu.Tuy nhiên, nó vẫn là một bản sao nông và các danh sách lồng nhau đề cập đến chính xác cùng một vị trí bộ nhớ.Nói cách khác, bản sao.Hàm Copy () chỉ tạo các bản sao cấp cao nhất và không sao chép các đối tượng lồng nhau.shallow copy, and the nested lists refer to exactly the same memory location. In other words, the copy. copy() function only makes top-level copies and doesn't copy nested objects.