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 cần có một bản sao để người dùng có thể thay đổi một bản sao mà không cần thay đổi bản kia. Mô-đun này cung cấp các thao tác sao chép nông và sâu chung chung [được giải thích bên dưới]
Tóm tắt giao diện
copy.
copy
[ x ]Trả lại một bản sao nông của x
copy.
deepcopy
[ x ]Trả lại một bản sao sâu của x
ngoại lệcopy.
error
Tăng cho các lỗi mô-đun cụ thể
Sự khác biệt giữa sao chép nông và sâu chỉ liên quan đến các đối tượng phức hợp [các đối tượng chứa các đối tượng khác, như danh sách hoặc thể hiện của lớp]
Một bản sao nông xây dựng một đối tượng ghé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
Một 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 đó.
Hai vấn đề thường tồn tại với thao tác sao chép sâu mà không tồn tại với thao tác sao chép nông
Các đối tượng đệ quy [các đối tượng phức hợp, trực tiếp hoặc gián tiếp, chứa tham chiếu đến chính chúng] có thể gây ra 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 được chia sẻ giữa các bản sao
Chức năng tránh những vấn đề này bằng cách
giữ một từ điển “ghi nhớ” về các đối tượng đã được sao chép trong quá trình sao chép hiện tại;
cho phép các lớp do người dùng định nghĩa 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ổ, mảng hoặc bất kỳ loại tương tự nào. Nó thực hiện “sao chép” các hàm và lớp [nông và sâu], bằng cách trả lại đối tượng ban đầu không thay đổi;
Bản sao nông của từ điển có thể được tạo bằng cách sử dụng và của danh sách bằng cách chỉ định một phần của toàn bộ danh sách, ví dụ: copy.
0
Đã thay đổi trong phiên bản 2. 5. Đã thêm chức năng sao chép.
Các lớp có thể sử dụng cùng một giao diện để kiểm soát việc sao chép mà chúng sử dụng để kiểm soát việc tẩy. Xem mô tả của mô-đun để biết thông tin về các phương pháp này. Mô-đun không sử dụng mô-đun đăng ký
Để một lớp định nghĩa việc triển khai sao chép của riêng mình, nó có thể định nghĩa các phương thức đặc biệt copy.
4 và copy.
5. Cái trước được gọi để thực hiện thao tác sao chép nông; . Cái sau được gọi để thực hiện thao tác sao chép sâu; . Nếu việc triển khai copy.
5 cần tạo một bản sao sâu của một thành phần, thì nó sẽ gọi hàm với thành phần đó làm đối số đầu tiên và từ điển ghi nhớ làm đối số thứ hai
Các phương thức Copy List[] của Python trả về một bản sao nông của danh sách [trả về một danh sách mới mà không sửa đổi danh sách ban đầu]
Đôi khi, có nhu cầu sử dụng lại bất kỳ đối tượng nào, do đó các phương thức sao chép luôn hữu ích. Python trong ngôn ngữ của nó cung cấp một số cách để đạt được điều này. Bài viết cụ thể này nhằm mục đích chứng minh phương pháp sao chép có trong danh sách. Vì danh sách này được sử dụng rộng rãi nên việc sao chép nó cũng là cần thiết
danh sách Python. sao chép [] Cú pháp
cú pháp. danh sách. sao chép[]
Thông số. Phương thức copy[] không nhận bất kỳ tham số nào
trả lại. Trả về một bản sao nông của một danh sách. Bản sao nông có nghĩa là mọi sửa đổi trong danh sách mới sẽ không được phản ánh trong danh sách gốc.
ví dụ 1. Minh họa hoạt động của danh sách. sao chép[]
Ở đây chúng tôi sẽ tạo một danh sách và sau đó tạo một bản sao nông bằng cách sử dụng danh sách. sao chép [] bằng Python
Python3
# Python 3 code to demonstrate
# working of list.copy[]
# Initializing list
lis1
=
[
1
,
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]0_______35_______
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]2
,
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]4
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]5
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]6
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]7
=
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]9
# Python 3 code to demonstrate
0
# Python 3 code to demonstrate
1 # Python 3 code to demonstrate
2# Python 3 code to demonstrate
3 # Python 3 code to demonstrate
4 # Python 3 code to demonstrate
5# Python 3 code to demonstrate
6
# Python 3 code to demonstrate
7
# Python 3 code to demonstrate
8# Python 3 code to demonstrate
9# working of list.copy[]
0
# working of list.copy[]
1
# working of list.copy[]
2
# Python 3 code to demonstrate
1 # working of list.copy[]
4# working of list.copy[]
5 # working of list.copy[]
6
# working of list.copy[]
7# Python 3 code to demonstrate
4 # Python 3 code to demonstrate
5# Python 3 code to demonstrate
6
# Python 3 code to demonstrate
1 # Initializing list
2# working of list.copy[]
5 # Initializing list
4# working of list.copy[]
5 # Initializing list
6
# working of list.copy[]
7# Python 3 code to demonstrate
4 # Python 3 code to demonstrate
5lis1
0
Đầu ra
The new list created is : [1, 2, 3, 4] The new list after adding new element : [1, 2, 3, 4, 5] The old list after adding new element to new list : [1, 2, 3, 4]
Ghi chú. Một bản sao nông có nghĩa là nếu chúng ta sửa đổi bất kỳ phần tử danh sách lồng nhau nào, các thay đổi sẽ được phản ánh trong cả hai danh sách khi chúng trỏ đến cùng một tham chiếu. Trong khi ở bản sao sâu, khi chúng tôi thêm một phần tử vào bất kỳ danh sách nào, chỉ danh sách đó được sửa đổi. Khi chúng ta sử dụng toán tử “=”[gán], danh sách mới đề cập đến cùng một đối tượng, do đó mọi thay đổi [chắp thêm, xóa, thay đổi giá trị] trong một danh sách đều được phản ánh trên cả hai. Nhưng khi chúng ta sử dụng danh sách. copy[], những thay đổi được thực hiện cho một danh sách hoặc không được phản ánh trên danh sách khác ngoại trừ trong các phần tử lồng nhau [như danh sách trong danh sách], Ở đây chúng ta nên sử dụng bản sao. deepcopy[] từ mô-đun sao chép để tránh sự cố này
Vui lòng tham khảo bài viết này Bản sao sâu vs Bản sao nông.
- Kỹ thuật sao chép sâu.
- Sử dụng bản sao. bản sao sâu []
- Kỹ thuật sao chép nông.
- Sử dụng bản sao. sao chép[]
- Sử dụng danh sách. sao chép[]
- sử dụng cắt lát
ví dụ 2. Trình diễn kỹ thuật chép nông, chép sâu
Ở đây chúng tôi sẽ tạo một danh sách và sau đó tạo một bản sao nông bằng cách sử dụng danh sách. copy[] và deep Copy sử dụng deepcopy[] trong Python
Python3
# Python 3 code to demonstrate
lis1
2
lis1
3 lis1
4
# Initializing list
lis1
6_______32_______ [
1
=
0_______0_______0,
0_______2=
4_______0_______4
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]5
=
7
=
8=
lis1
6
[
1
[
2
[
3
[
4=
[
6
[
7
[
8=
1
0
1
1# Python 3 code to demonstrate
9# working of list.copy[]
0
1
41
1
6_______34_______
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]5
=
,
0
# Python 3 code to demonstrate
1# Python 3 code to demonstrate
2,
3,
4
# Python 3 code to demonstrate
1# Python 3 code to demonstrate
2,
7,
8
# Python 3 code to demonstrate
1# Python 3 code to demonstrate
2
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]01
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]02
# Python 3 code to demonstrate
1# Python 3 code to demonstrate
2
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]05
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]06
Đầu ra
list 1 after modification: [1, [2, 999], 4, 5] list 2 after modification: [1, [2, 999], 4, 5] list 3 after modification: [1, [2, 999], 4] list 4 after modification: [1, [2, 3], 4]
Phân tích độ phức tạp.
Độ phức tạp về thời gian của việc tạo một bản sao của danh sách bằng phương thức copy[] là O[n], trong đó n là số phần tử trong danh sách. Điều này là do phương thức copy[] cần lặp qua tất cả các phần tử trong danh sách để tạo một danh sách mới chứa các phần tử giống nhau
Không gian phụ của việc tạo một bản sao của danh sách bằng phương thức copy[] cũng là O[n] do danh sách mới có cùng số lượng phần tử như danh sách ban đầu cần được tạo