Đâu là sự khác biệt giữa copy copy() và copy Deepcopy() trong Python?

Trong lập trình Python, khi chúng ta sao chép bằng toán tử

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
0, nó không tạo đối tượng mới. Trong trường hợp này, biến mới chia sẻ cùng một tham chiếu của đối tượng ban đầu. Vì vậy, mọi thay đổi được thực hiện trong bất kỳ đối tượng nào đều được phản ánh trên cả hai đối tượng. Xem ví dụ bên dưới

Ví dụ. Sao chép Sử dụng = Toán tử


# Copy using '=' operators
numbers = [[30, 30], [70, 70], [90, 90]]
numbers_copy = numbers
numbers_copy[0][1] = 55

print['Numbers = ', numbers]
print['Reference of numbers = ', id[numbers]]
print[]
print['Numbers_copy = ', numbers_copy]
print['Reference of numbers_copy = ', id[numbers_copy]]

đầu ra

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648

Trong ví dụ trên,

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
1 của cả
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
2 và
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 đều giống nhau. Và thay đổi được thực hiện trong
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 cũng được phản ánh trong
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
2

Bản sao nông

  • Bản sao nông tạo một bản sao của đối tượng nhưng tham chiếu đến từng thành phần của đối tượng. Nói cách khác, sao chép nông có nghĩa là xây dựng một đối tượng 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 đối tượng ban đầu
  • Quá trình sao chép không được đệ quy trong bản sao nông, do đó các bản sao của các đối tượng con không được tạo
  • Trong trường hợp sao chép nông, tham chiếu của đối tượng được sao chép sang đối tượng khác i. e. mọi thay đổi được thực hiện trong bản sao cũng được phản ánh trong đối tượng ban đầu
  • Trong Python, bản sao nông có thể được triển khai bằng cách sử dụng mô-đun
    Numbers =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers =  1501470648648
    
    Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers_copy =  1501470648648
    
    2 có phương thức
    Numbers =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers =  1501470648648
    
    Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers_copy =  1501470648648
    
    3

Ví dụ sao chép nông


# shallow copy
import copy
numbers = [[30, 30], [70, 70], [90, 90]]
numbers_copy = copy.copy[numbers]
numbers_copy[0][1] = 55

print['Numbers = ', numbers]
print['Reference of numbers = ', id[numbers]]
print[]
print['Numbers_copy = ', numbers_copy]
print['Reference of numbers_copy = ', id[numbers_copy]]

đầu ra

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470952904

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470650120

Trong ví dụ trên,

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
1 của
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
2 và
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 khác nhau, nhưng, thay đổi được thực hiện trong
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 được phản ánh trong cả hai đối tượng

Đây là hình minh họa của bản sao nông

Nhân vật. Bản sao nông

Sao chép sâu

  • Bản sao sâu tạo bản sao của đối tượng cũng như các thành phần của đối tượng. Nói cách khác, sao chép sâu có nghĩa là trước tiên xây dựng một đối tượng bộ sưu tập mới và sau đó điền đệ quy vào đó các bản sao của các đối tượng con được tìm thấy trong bản gốc
  • Quá trình sao chép là đệ quy trong trường hợp sao chép sâu, do đó các bản sao của bản sao con được tạo
  • Trong bản sao sâu, những thay đổi được thực hiện đối với bản sao của đối tượng không phản ánh trong đối tượng ban đầu
  • Trong Python, bản sao nông có thể được triển khai bằng cách sử dụng mô-đun
    Numbers =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers =  1501470648648
    
    Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers_copy =  1501470648648
    
    2 có phương thức
    Numbers =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers =  1501470648648
    
    Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
    Reference of numbers_copy =  1501470648648
    
    9

Ví dụ sao chép sâu

________số 8

đầu ra

Numbers =  [[30, 30], [70, 70], [90, 90]]
Reference of numbers =  3012519166856

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  3012519195080

Trong ví dụ trên,

Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
1 của
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
2 và
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 khác nhau và, thay đổi được thực hiện trong
Numbers =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers =  1501470648648

Numbers_copy =  [[30, 55], [70, 70], [90, 90]]
Reference of numbers_copy =  1501470648648
3 không được phản ánh trong cả hai đối tượng

Dưới đây là hình minh họa của deep copy

Nhân vật. Sao chép sâu

Do đó, một bản sao nông xây dựng một đối tượng ghép mới và sau đó chèn các tham chiếu vào đối tượng được tìm thấy trong bản gốc nhưng bản sao sâu tạo một đối tượng ghép mới và sau đó chèn đệ quy các bản sao của các đối tượng được tìm thấy trong đối tượng gốc

Sự khác biệt giữa sao chép copy[] và sao chép Deepcopy[] là gì?

Bản sao[] trả về bản sao nông của danh sách và bản sao sâu[] trả về bản sao sâu của danh sách .

Sự khác biệt giữa sao chép sâu và sao chép trong Python là gì?

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

Bản sao [] nông hay sâu?

Trong Bản sao nông, một bản sao của đối tượng ban đầu được lưu trữ và cuối cùng chỉ có địa chỉ tham chiếu được sao chép. Trong Bản sao sâu, cả bản sao của đối tượng gốc và bản sao lặp lại đều được lưu trữ. 2. . Sao chép sâu

Bản sao Python nông hay sâu?

Trong Python, bản sao nông là bản sao “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 ban đầu. Một bản sao sâu hoàn toàn độc lập với đối tượng ban đầu. Nó xây dựng một đối tượng bộ sưu tập mới bằng cách điền đệ quy nó với các bản sao của các đối tượng con.

Chủ Đề