Hướng dẫn python copy class object - đối tượng lớp sao chép 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):

  • 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

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))
8 tránh những vấn đề này bằng cách:

  • Giữ một từ điển

    old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]
    new_list = old_list
    
    new_list[2][2] = 9
    
    print('Old List:', old_list)
    print('ID of Old List:', id(old_list))
    
    print('New List:', new_list)
    print('ID of New List:', id(new_list))
    9 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

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
0.

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: 140673303268168
1 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: 140673303268168
2.

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: 140673303268168
0 để 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: 140673303268168
4 sử dụng các hàm Pickle đã đăng ký 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: 140673303268168
5.

Để 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

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
6 và
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
7. 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, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))
9. Nếu việc triển khai
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
7 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, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))
8 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
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
0

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.

Để có được một bản sao độc lập hoàn toàn của một đối tượng, bạn có thể sử dụng hàm Copy.DeepCopy ().copy.deepcopy() function.

Làm cách nào để sao chép một lớp tùy chỉnh trong Python?

Nói chung, bạn có thể sử dụng mô -đun sao chép để tạo các bản sao của các đối tượng Python ...

sao chép.Sao chép () sẽ tạo ra một bản sao nông;Một thể hiện mới được tạo nhưng tất cả các thuộc tính chỉ được sao chép.....Show

  • Để có được một bản sao độc lập hoàn toàn của một đối tượng, bạn có thể sử dụng hàm Copy.DeepCopy ().copy.deepcopy() function.
  • Làm cách nào để sao chép một lớp tùy chỉnh trong Python?
  • Ví dụ 3: Thêm [4, 4, 4] vào old_list, sử dụng bản sao nông cạn
  • Sao chép sâu
  • Ví dụ 3: Thêm [4, 4, 4] vào old_list, sử dụng bản sao nông cạn
  • Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạn
  • Để 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ó.
  • Đ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.
  • Sao chép sâu
  • Để 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ó.
  • Để 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ó.
  • Sao chép sâu
  • Sao chép mô -đun
  • 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.Assignment statements do not copy objects, they create bindings between a target and an object. When we use the = operator, It only creates a new variable that shares the reference of the original object.

Làm cách nào để trả về một bản sao của một đối tượng lớp trong Python?

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
3.

Ví dụ 1: Sao chép bằng cách sử dụng = toán tử

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))

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 i.e

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
5.

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:

  1. Bản sao nông
  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

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
6.

Sao chép mô -đun

Chúng tôi sử dụ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: 140673303268168
6 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,

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
8 trả về một bản sao nông của x. Tương tự,
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
9 Trả về một bản sao sâu của x.

Bản sao nông

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

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
6.

Sao chép 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: 140673303268168
1

Chúng tôi sử dụ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: 140673303268168
6 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,

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
8 trả về một bản sao nông của x. Tương tự,
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
9 Trả về một bản sao sâu của x.

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
6 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]]
ID of Old List: 140673303268168

New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ID of New List: 140673303268168
3

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.

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
6

Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạ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: 140673303268168
7

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: 140673303268168
8.

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


Đ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ụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạ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: 140673303268168
9

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: 140673303268168
8.

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

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
6.

Sao chép mô -đun

Chúng tôi sử dụng mô -đun

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))
2

Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạ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: 140673303268168
0

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: 140673303268168
8.

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


Đ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.

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
1

Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạ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: 140673303268168
2

Khi chúng tôi chạy chương trình, đầu ra sẽ là:

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

Đ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ó.Assignment statements do not copy objects, they create bindings between a target and an object. When we use the = operator, It only creates a new variable that shares the reference of the original object.

Ví dụ 3: Thêm [4, 4, 4] vào old_list, sử dụng bản sao nông cạn

Chúng tôi sử dụ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: 1406733032681686 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ụ:copy. deepcopy() function.

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: 1406733032681688.

Đối tượng nào không thể được sao chép trong Python?.

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.Assignment statements do not copy objects, they create bindings between a target and an object. When we use the = operator, It only creates a new variable that shares the reference of the original object.

Làm cách nào để trả về một bản sao của một đối tượng lớp trong Python?

Để có được một bản sao độc lập hoàn toàn của một đối tượng, bạn có thể sử dụng hàm Copy.DeepCopy ().copy.deepcopy() function.

Làm cách nào để sao chép một lớp tùy chỉnh trong Python?