Hướng dẫn deep copy and shallow copy in python - bản sao sâu và bản sao nông trong python
Mã nguồn: lib/copy.py Lib/copy.py Show
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):
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:
Hàm Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681683 tránh những vấn đề này bằng cách:
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 Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681685. 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 Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681686 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ụ, Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681687. 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 Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681685 để biết thông tin về các phương pháp này. Trên thực tế, mô -đun Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681689 sử dụng các hàm Pickle đã đăng ký từ mô -đun import copy copy.copy(x) copy.deepcopy(x)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 import copy copy.copy(x) copy.deepcopy(x)1 và import copy copy.copy(x) copy.deepcopy(x)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 Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681684. Nếu việc triển khai import copy copy.copy(x) copy.deepcopy(x)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 Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681683 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ô -đunOld List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681685 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. Tuy nhiên, nếu bạn thực hiện các thay đổi đối với bất kỳ đối tượng lồng nhau nào trong đối tượng gốc Old_list, bạn sẽ thấy không có thay đổi nào đối với bản sao new_list.Ví dụ 6: Thêm một đối tượng lồng nhau mới trong danh sách bằng cách sử dụng Sao chép sâu Trong chương trình trên, khi chúng ta gán một giá trị mới cho old_list, chúng ta có thể thấy Old_list được sửa đổi. Điều này có nghĩa là, cả old_list và new_list đều độc lập. Điều này là do Old_list được sao chép đệ quy, điều này đúng với tất cả các đối tượng lồng nhau của nó. Ví dụ 1: Sao chép bằng cách sử dụng = toán tử
Khi chúng tôi chạy trên chương trình, đầu ra sẽ là: Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 140673303268168 Như bạn có thể thấy từ đầu ra, cả hai biến Old_List và New_list chia sẻ cùng một ID id import copy copy.copy(x) copy.deepcopy(x)9. Vì vậy, nếu bạn muốn sửa đổi bất kỳ giá trị nào trong new_list hoặc old_list, thay đổi có thể nhìn thấy trong cả hai. Về cơ bản, đôi khi bạn có thể muốn có các giá trị ban đầu không thay đổi và chỉ sửa đổi các giá trị mới hoặc ngược lại. Trong Python, có hai cách để tạo bản sao:
Để làm cho các bản sao này hoạt động, chúng tôi sử dụng mô -đun 0.Sao chép mô -đunChúng tôi sử dụng mô -đun 0 của Python cho các hoạt động sao chép nông và sâu. Giả sử, bạn cần sao chép danh sách hỗn hợp nói x. Ví dụ:import copy copy.copy(x) copy.deepcopy(x) Ở đây, 2 trả về một bản sao nông của x. Tương tự, 3 Trả về một bản sao sâu của x.Bản sao nôngSao chép sâu Để làm cho các bản sao này hoạt động, chúng tôi sử dụng mô -đun 0.Sao chép mô -đun
Chúng tôi sử dụng mô -đun 0 của Python cho các hoạt động sao chép nông và sâu. Giả sử, bạn cần sao chép danh sách hỗn hợp nói x. Ví dụ:Old list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] New list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Ở đây, 2 trả về một bản sao nông của x. Tương tự, 3 Trả về một bản sao sâu của x.Một bản sao nông tạo ra một đối tượng mới lưu trữ tham chiếu của các phần tử gốc. Vì vậy, một bản sao nông không tạo ra một bản sao của các đối tượng lồng nhau, thay vào đó, nó chỉ sao chép tham chiếu của các đối tượng lồng nhau. Điều này có nghĩa là, một quá trình sao chép không tái diễn hoặc tạo các bản sao của chính các đối tượng lồng nhau. Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạn
Khi chúng tôi chạy chương trình, đầu ra sẽ là: Old list: [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]] New list: [[1, 1, 1], [2, 2, 2], [3, 3, 3]] Trong chương trình trên, chúng tôi đã tạo một danh sách lồng nhau và sau đó sao chép nông cạn bằng phương pháp 2.Điều này có nghĩa là nó sẽ tạo ra đối tượng mới và độc lập với cùng một nội dung. Để xác minh điều này, chúng tôi in cả Old_List và New_List. Để xác nhận rằng new_list khác với old_list, chúng tôi cố gắng thêm đối tượng lồng nhau mới & nbsp; vào bản gốc và kiểm tra nó.Ví dụ 3: Thêm [4, 4, 4] vào old_list, sử dụng bản sao nông cạnKhi chúng tôi chạy chương trình, đầu ra sẽ là: Old list: [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]] New list: [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]] Trong chương trình trên, chúng tôi đã tạo một danh sách lồng nhau và sau đó sao chép nông cạn bằng phương pháp 2.Sao chép sâuĐể làm cho các bản sao này hoạt động, chúng tôi sử dụng mô -đun 0.Sao chép mô -đun Chúng tôi sử dụng mô -đun import copy old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] new_list = copy.copy(old_list) print("Old list:", old_list) print("New list:", new_list)0 của Python cho các hoạt động sao chép nông và sâu. Giả sử, bạn cần sao chép danh sách hỗn hợp nói x. Ví dụ:
Khi chúng tôi chạy chương trình, đầu ra sẽ là: Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681680 Trong chương trình trên, chúng tôi đã tạo một danh sách lồng nhau và sau đó sao chép nông cạn bằng phương pháp 2.Điều này có nghĩa là nó sẽ tạo ra đối tượng mới và độc lập với cùng một nội dung. Để xác minh điều này, chúng tôi in cả Old_List và New_List. Để xác nhận rằng new_list khác với old_list, chúng tôi cố gắng thêm đối tượng lồng nhau mới & nbsp; vào bản gốc và kiểm tra nó.Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681681 Khi chúng tôi chạy chương trình, đầu ra sẽ là: Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of Old List: 140673303268168 New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ID of New List: 1406733032681682 Trong chương trình trên, chúng tôi đã tạo một danh sách lồng nhau và sau đó sao chép nông cạn bằng phương pháp 2.
Bản sao sâu và nông trong Python là gì?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.
Sự khác biệt giữa một bản sao nông và bản sao sâu là gì?Bản sao nông lưu trữ bản sao của đối tượng gốc và trỏ các tham chiếu đến các đối tượng. Bản sao lưu trữ bản sao của đối tượng gốc và sao chép đệ quy các đối tượng.Bản sao nông nhanh hơn.Bản sao sâu tương đối chậm hơn. Deep copy stores the copy of the original object and recursively copies the objects as well. Shallow copy is faster. Deep copy is comparatively slower.
Python là bản sao sâu hay bản sao nông?Trong Python, một bản sao nông là bản sao một cấp độ sâu một cấp.Đối tượng được sao chép chứa các tham chiếu đến các đối tượng con của đối tượng gốc.Một bản sao sâu hoàn toàn độc lập với đối tượng gốc.Nó xây dựng một đối tượng bộ sưu tập mới bằng cách cư trú đệ quy nó với các bản sao của các đối tượng con.a shallow copy is a “one-level-deep” copy. The copied object contains references to the child objects of the original object. A deep copy is completely independent of the original object. It constructs a new collection object by recursively populating it with copies of the child objects.
Bản sao nông trong Python là gì?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 đó điền nó với các tham chiếu đến các đối tượng con được tìm thấy trong bản gốc.Về bản chất, một bản sao nông chỉ là một cấp độ sâu.Quá trình sao chép không tái phát và do đó sẽ không tạo bản sao của chính các đối tượng con.constructing a new collection object and then populating it with references to the child objects found in the original. In essence, a shallow copy is only one level deep. The copying process does not recurse and therefore won't create copies of the child objects themselves. |