Trong hướng dẫn này, chúng tôi sẽ tìm hiểu về phương thức Danh sách Python () với sự trợ giúp của các ví dụ. Show
Phương thức 5 trả về một bản sao nông của danh sách.Thí dụ
Sao chép () Cú phápCú pháp của phương thức 5 là:
Sao chép () tham sốPhương thức 5 không lấy bất kỳ tham số nào.sao chép () giá trị trả vềPhương thức 5 trả về một danh sách mới. Nó không sửa đổi danh sách ban đầu.Ví dụ: Sao chép danh sách
Đầu ra Copied List: ['cat', 0, 6.7] Nếu bạn sửa đổi new_list trong ví dụ trên, my_list sẽ không được sửa đổi. Danh sách bản sao bằng cách sử dụng =Chúng tôi cũng có thể sử dụng toán tử 9 để sao chép danh sách. Ví dụ,old_list = [1, 2, 3] new_list = old_list Howerver, có một vấn đề với việc sao chép danh sách theo cách này. Nếu bạn sửa đổi new_list, old_list cũng được sửa đổi. Đó là bởi vì danh sách mới đang tham khảo hoặc chỉ vào cùng một đối tượng Old_list.
Đầu ra Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a'] Nếu bạn sửa đổi new_list trong ví dụ trên, my_list sẽ không được sửa đổi. Danh sách bản sao bằng cách sử dụng = Python Shallow Copy Vs Deep Copy Chúng tôi cũng có thể sử dụng toán tử new_list = old_list.copy() 9 để sao chép danh sách. Ví dụ,
Đầu ra Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog'] Sao chép một danh sáchBạn không thể sao chép danh sách chỉ bằng cách nhập 01, bởi vì: 02 sẽ chỉ là một tham chiếu đến 03 và các thay đổi được thực hiện trong 03 cũng sẽ tự động được thực hiện trong 02.Có nhiều cách để tạo một bản sao, một cách là sử dụng phương pháp danh sách tích hợp 06.Thí dụTạo một bản sao của một danh sách với phương thức 5: Danh sách này = ["Apple", "Banana", "Cherry"] mylist = ThisList.Copy () in (Mylist) Hãy tự mình thử » Một cách khác để tạo một bản sao là sử dụng phương thức tích hợp 08.Thí dụTạo một bản sao của một danh sách với phương thức 5: Danh sách này = ["Apple", "Banana", "Cherry"] mylist = ThisList.Copy () in (Mylist) Hãy tự mình thử » 10 không thực sự tạo danh sách thứ hai. Bài tập chỉ sao chép tham chiếu vào danh sách, không phải danh sách thực tế, vì vậy cả 11 và 12 đều đề cập đến cùng một danh sách sau khi chuyển nhượng.Để thực sự sao chép danh sách, bạn có một số tùy chọn:
Example: 4Result: 5
wjandrea 25.2k8 Huy hiệu vàng53 Huy hiệu bạc74 Huy hiệu đồng8 gold badges53 silver badges74 bronze badges Đã trả lời ngày 10 tháng 4 năm 2010 lúc 8:55Apr 10, 2010 at 8:55
Felix Klingfelix KlingFelix Kling 774K172 Huy hiệu vàng1069 Huy hiệu bạc1116 Huy hiệu đồng172 gold badges1069 silver badges1116 bronze badges 4 Felix đã cung cấp một câu trả lời tuyệt vời, nhưng tôi nghĩ rằng tôi sẽ so sánh tốc độ các phương pháp khác nhau:
Vì vậy, nhanh nhất là danh sách cắt lát. Nhưng hãy lưu ý rằng 15, 29 và 30, không giống như 18 và phiên bản Python không sao chép bất kỳ danh sách, từ điển và trường hợp lớp nào trong danh sách, vì vậy nếu bản gốc thay đổi, họ cũng sẽ thay đổi trong danh sách sao chép và ngược lại.(Đây là kịch bản nếu có ai quan tâm hoặc muốn nêu ra bất kỳ vấn đề nào :) 6
Đã trả lời ngày 10 tháng 4 năm 2010 lúc 10:16Apr 10, 2010 at 10:16
Cryocryocryo Huy hiệu vàng 14K431 Huy hiệu bạc35 Huy hiệu đồng4 gold badges31 silver badges35 bronze badges 7 Tôi đã được thông báo rằng Python 3.3+ thêm phương thức 13, sẽ nhanh như cắt lát: 7
Đã trả lời ngày 23 tháng 7 năm 2013 lúc 12:32Jul 23, 2013 at 12:32
Anatoly Techtonikanatoly Techtonikanatoly techtonik 19.2k9 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng9 gold badges122 silver badges137 bronze badges 5
Trong Python 3, một bản sao nông có thể được thực hiện bằng: 8Trong Python 2 và 3, bạn có thể nhận được một bản sao nông với một lát hoàn toàn của bản gốc: 9Giải trìnhCó hai cách ngữ nghĩa để sao chép một danh sách. Một bản sao nông tạo ra một danh sách mới của cùng một đối tượng, một bản sao sâu tạo ra một danh sách mới chứa các đối tượng tương đương mới. Bản sao danh sách nôngMột bản sao nông chỉ sao chép danh sách, đó là một thùng chứa các tài liệu tham khảo cho các đối tượng trong danh sách. Nếu các đối tượng chứa chính chúng bị thay đổi và một đối tượng được thay đổi, thay đổi sẽ được phản ánh trong cả hai danh sách. Có nhiều cách khác nhau để làm điều này trong Python 2 và 3. Các cách Python 2 cũng sẽ hoạt động trong Python 3. Python 2Trong Python 2, cách thành ngữ để tạo một bản sao nông của danh sách là với một lát hoàn chỉnh của bản gốc: 9Bạn cũng có thể hoàn thành điều tương tự bằng cách chuyển danh sách thông qua trình xây dựng danh sách, 1Nhưng sử dụng hàm tạo kém hiệu quả: 2Python 3Trong Python 3, danh sách nhận phương thức 33: 8Trong Python 3.5: 4Tạo một con trỏ khác không tạo một bản sao
12 chỉ là một cái tên chỉ vào danh sách thực tế trong bộ nhớ. Khi bạn nói 10 Bạn không tạo một bản sao, bạn chỉ cần thêm một tên khác chỉ vào danh sách ban đầu đó trong bộ nhớ. Chúng ta có thể có vấn đề tương tự khi chúng ta tạo các bản sao của danh sách. 5Danh sách chỉ là một loạt các gợi ý cho các nội dung, vì vậy một bản sao nông chỉ sao chép các con trỏ, và vì vậy bạn có hai danh sách khác nhau, nhưng chúng có cùng nội dung. Để tạo các bản sao của nội dung, bạn cần một bản sao sâu. Bản sao sâuĐể tạo một bản sao sâu của danh sách, trong Python 2 hoặc 3, hãy sử dụng 36 trong mô -đun 37: 6Để chứng minh làm thế nào điều này cho phép chúng ta lập danh sách phụ mới: 7Và vì vậy chúng tôi thấy rằng danh sách sao chép sâu là một danh sách hoàn toàn khác so với bản gốc. Bạn có thể cuộn chức năng của riêng mình - nhưng đừng. Bạn có thể tạo ra các lỗi mà bạn không có bằng cách sử dụng chức năng DeepCopy của thư viện tiêu chuẩn. Không sử dụng new_list = list.copy()38Bạn có thể thấy điều này được sử dụng như một cách để DeepCopy, nhưng đừng làm điều đó: 8
Trong 64 bit Python 2.7: 9trên 64 bit Python 3.5: Copied List: ['cat', 0, 6.7]0 Đã trả lời ngày 25 tháng 10 năm 2014 lúc 12:13Oct 25, 2014 at 12:13
1 Hãy bắt đầu từ đầu và khám phá câu hỏi này. Vì vậy, giả sử bạn có hai danh sách: Copied List: ['cat', 0, 6.7]1 Và chúng tôi phải sao chép cả hai danh sách, bây giờ bắt đầu từ danh sách đầu tiên: Vì vậy, trước tiên hãy thử bằng cách đặt biến 37 vào danh sách ban đầu của chúng tôi, 40:Copied List: ['cat', 0, 6.7]2 Bây giờ nếu bạn đang nghĩ sao chép đã sao chép danh sách_1, thì bạn đã sai. Hàm 41 có thể hiển thị cho chúng ta nếu hai biến có thể trỏ đến cùng một đối tượng. Chúng ta hãy cố gắng này:Copied List: ['cat', 0, 6.7]3 Đầu ra là: Copied List: ['cat', 0, 6.7]4 Cả hai biến là một đối số chính xác. Bạn có ngạc nhiên không? Vì vậy, như chúng ta đã biết, Python không lưu trữ bất cứ thứ gì trong một biến, các biến chỉ tham chiếu đến đối tượng và đối tượng lưu trữ giá trị. Ở đây đối tượng là một 42 nhưng chúng tôi đã tạo hai tham chiếu đến cùng một đối tượng bằng hai tên biến khác nhau. Điều này có nghĩa là cả hai biến đang chỉ vào cùng một đối tượng, chỉ với các tên khác nhau.Khi bạn làm 43, nó thực sự đang làm:Ở đây trong hình ảnh list_1 và sao chép là hai tên biến, nhưng đối tượng giống nhau cho cả hai biến là 42.Vì vậy, nếu bạn cố gắng sửa đổi danh sách đã sao chép thì nó cũng sẽ sửa đổi danh sách ban đầu vì danh sách chỉ là một ở đó, bạn sẽ sửa đổi danh sách đó bất kể bạn làm từ danh sách sao chép hoặc từ danh sách gốc: Copied List: ['cat', 0, 6.7]5 Output: Copied List: ['cat', 0, 6.7]6 Vì vậy, nó đã sửa đổi danh sách ban đầu: Bây giờ chúng ta hãy chuyển sang một phương pháp pythonic để sao chép danh sách. Copied List: ['cat', 0, 6.7]7 Phương pháp này khắc phục vấn đề đầu tiên chúng tôi có: Copied List: ['cat', 0, 6.7]8 Vì vậy, vì chúng ta có thể thấy cả hai danh sách của chúng ta có ID khác nhau và điều đó có nghĩa là cả hai biến đang chỉ vào các đối tượng khác nhau. Vì vậy, những gì thực sự xảy ra ở đây là: Bây giờ chúng ta hãy cố gắng sửa đổi danh sách và hãy xem liệu chúng ta có còn phải đối mặt với vấn đề trước đó không: Copied List: ['cat', 0, 6.7]9 Đầu ra là: old_list = [1, 2, 3] new_list = old_list0 Cả hai biến là một đối số chính xác. Bạn có ngạc nhiên không? Vì vậy, như chúng ta đã biết, Python không lưu trữ bất cứ thứ gì trong một biến, các biến chỉ tham chiếu đến đối tượng và đối tượng lưu trữ giá trị. Ở đây đối tượng là một 42 nhưng chúng tôi đã tạo hai tham chiếu đến cùng một đối tượng bằng hai tên biến khác nhau. Điều này có nghĩa là cả hai biến đang chỉ vào cùng một đối tượng, chỉ với các tên khác nhau.old_list = [1, 2, 3] new_list = old_list1 Khi bạn làm 43, nó thực sự đang làm:old_list = [1, 2, 3] new_list = old_list2 Ở đây trong hình ảnh list_1 và sao chép là hai tên biến, nhưng đối tượng giống nhau cho cả hai biến là 42.old_list = [1, 2, 3] new_list = old_list3 Vì vậy, nếu bạn cố gắng sửa đổi danh sách đã sao chép thì nó cũng sẽ sửa đổi danh sách ban đầu vì danh sách chỉ là một ở đó, bạn sẽ sửa đổi danh sách đó bất kể bạn làm từ danh sách sao chép hoặc từ danh sách gốc: old_list = [1, 2, 3] new_list = old_list4 Vì vậy, nó đã sửa đổi danh sách ban đầu: old_list = [1, 2, 3] new_list = old_list5 Bây giờ chúng ta hãy chuyển sang một phương pháp pythonic để sao chép danh sách. Phương pháp này khắc phục vấn đề đầu tiên chúng tôi có: old_list = [1, 2, 3] new_list = old_list1 Vì vậy, vì chúng ta có thể thấy cả hai danh sách của chúng ta có ID khác nhau và điều đó có nghĩa là cả hai biến đang chỉ vào các đối tượng khác nhau. Vì vậy, những gì thực sự xảy ra ở đây là: old_list = [1, 2, 3] new_list = old_list7 Đầu ra là: old_list = [1, 2, 3] new_list = old_list8 Cả hai biến là một đối số chính xác. Bạn có ngạc nhiên không? Vì vậy, như chúng ta đã biết, Python không lưu trữ bất cứ thứ gì trong một biến, các biến chỉ tham chiếu đến đối tượng và đối tượng lưu trữ giá trị. Ở đây đối tượng là một 42 nhưng chúng tôi đã tạo hai tham chiếu đến cùng một đối tượng bằng hai tên biến khác nhau. Điều này có nghĩa là cả hai biến đang chỉ vào cùng một đối tượng, chỉ với các tên khác nhau.Khi bạn làm 43, nó thực sự đang làm:old_list = [1, 2, 3] new_list = old_list9 Ở đây trong hình ảnh list_1 và sao chép là hai tên biến, nhưng đối tượng giống nhau cho cả hai biến là 42. 0Vì vậy, nếu bạn cố gắng sửa đổi danh sách đã sao chép thì nó cũng sẽ sửa đổi danh sách ban đầu vì danh sách chỉ là một ở đó, bạn sẽ sửa đổi danh sách đó bất kể bạn làm từ danh sách sao chép hoặc từ danh sách gốc: 1Đầu ra là: 2Cả hai biến là một đối số chính xác. Bạn có ngạc nhiên không? Vì vậy, như chúng ta đã biết, Python không lưu trữ bất cứ thứ gì trong một biến, các biến chỉ tham chiếu đến đối tượng và đối tượng lưu trữ giá trị. Ở đây đối tượng là một 42 nhưng chúng tôi đã tạo hai tham chiếu đến cùng một đối tượng bằng hai tên biến khác nhau. Điều này có nghĩa là cả hai biến đang chỉ vào cùng một đối tượng, chỉ với các tên khác nhau.Khi bạn làm 43, nó thực sự đang làm:Ở đây trong hình ảnh list_1 và sao chép là hai tên biến, nhưng đối tượng giống nhau cho cả hai biến là 42. 3Vì vậy, nếu bạn cố gắng sửa đổi danh sách đã sao chép thì nó cũng sẽ sửa đổi danh sách ban đầu vì danh sách chỉ là một ở đó, bạn sẽ sửa đổi danh sách đó bất kể bạn làm từ danh sách sao chép hoặc từ danh sách gốc: 4Vì vậy, nó đã sửa đổi danh sách ban đầu:
Bây giờ chúng ta hãy chuyển sang một phương pháp pythonic để sao chép danh sách.Nov 13, 2017 at 7:04
Phương pháp này khắc phục vấn đề đầu tiên chúng tôi có:Aaditya Ura Vì vậy, vì chúng ta có thể thấy cả hai danh sách của chúng ta có ID khác nhau và điều đó có nghĩa là cả hai biến đang chỉ vào các đối tượng khác nhau. Vì vậy, những gì thực sự xảy ra ở đây là:7 gold badges44 silver badges79 bronze badges 0 Bây giờ chúng ta hãy cố gắng sửa đổi danh sách và hãy xem liệu chúng ta có còn phải đối mặt với vấn đề trước đó không: Như bạn có thể thấy, nó chỉ sửa đổi danh sách sao chép. Điều đó có nghĩa là nó đã làm việc. Mỗi phần tử của một danh sách hoạt động giống như một tên, trong đó mỗi phần tử liên kết không bị loại trừ với một đối tượng. Một bản sao nông tạo ra một danh sách mới có các yếu tố liên kết với cùng một đối tượng như trước đây. 5Để đưa danh sách của bạn sao chép thêm một bước nữa, hãy sao chép từng đối tượng mà danh sách của bạn đề cập và liên kết các bản sao phần tử đó vào danh sách mới. 6Đây chưa phải là một bản sao sâu, bởi vì mỗi yếu tố của một danh sách có thể đề cập đến các đối tượng khác, giống như danh sách bị ràng buộc với các yếu tố của nó. Để sao chép đệ quy mọi yếu tố trong danh sách, và sau đó các đối tượng khác được đề cập bởi từng phần tử, v.v.: Thực hiện một bản sao sâu. 7Xem tài liệu để biết thêm thông tin về các trường hợp góc trong sao chép. Đã trả lời ngày 23 tháng 11 năm 2014 lúc 16:45Nov 23, 2014 at 16:45
kiểm trajack 2.0141 Huy hiệu vàng17 Huy hiệu bạc17 Huy hiệu đồng1 gold badge17 silver badges17 bronze badges 0 Sử dụng 56 8Đã trả lời ngày 10 tháng 4 năm 2010 lúc 8:53Apr 10, 2010 at 8:53
Paul Tarjanpaul TarjanPaul Tarjan 47.7K59 Huy hiệu vàng166 Huy hiệu bạc213 Huy hiệu Đồng59 gold badges166 silver badges213 bronze badges Thời gian Python 3.6Dưới đây là kết quả thời gian sử dụng Python 3.6.8. Hãy ghi nhớ những thời điểm này là liên quan đến nhau, không tuyệt đối. Tôi chỉ mắc các bản sao nông, và cũng đã thêm một số phương pháp mới không thể xảy ra trong Python & nbsp; 2, chẳng hạn như 13 (Python & NBSP; 3 Slice tương đương) và hai hình thức danh sách giải nén ( 58 và 59): 9Chúng ta có thể thấy người chiến thắng Python 2 vẫn hoạt động tốt, nhưng không vượt qua Python 3 13, đặc biệt là xem xét khả năng đọc vượt trội của người sau.Ngựa tối là phương pháp giải nén và đóng gói lại ( 61), nhanh hơn ~ 25% so với cắt thô và nhanh hơn gấp đôi so với phương pháp giải nén khác ( 62). 63 cũng làm tốt một cách đáng ngạc nhiên.Lưu ý rằng các phương pháp này không đưa ra kết quả tương đương cho bất kỳ đầu vào nào ngoài danh sách. Tất cả chúng đều hoạt động cho các đối tượng có thể cắt xén, một số ít hoạt động cho bất kỳ điều gì có thể, nhưng chỉ 15 works for more general Python objects.Dưới đây là mã kiểm tra cho các bên quan tâm (mẫu từ đây): Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']0
Đã trả lời ngày 5 tháng 4 năm 2017 lúc 1:01Apr 5, 2017 at 1:01
Bờ sôngRiver 8.26514 Huy hiệu vàng54 Huy hiệu bạc65 Huy hiệu Đồng14 gold badges54 silver badges65 bronze badges 6 Thành ngữ của Python để làm điều này là 65Đã trả lời ngày 10 tháng 4 năm 2010 lúc 8:53Apr 10, 2010 at 8:53
Paul Tarjanpaul Tarjanerisco 47.7K59 Huy hiệu vàng166 Huy hiệu bạc213 Huy hiệu Đồng2 gold badges38 silver badges44 bronze badges Thời gian Python 3.6great answers, which work when you have a single dimension (leveled) list, however of the methods mentioned so far, only 18 works to clone/copy a list and not have it point to the nested 42 objects when you are working with multidimensional, nested lists (list of
lists). While Felix Kling refers to it in his answer, there is a little bit more to the issue and possibly a workaround using built-ins that might prove a faster alternative to 36.Dưới đây là kết quả thời gian sử dụng Python 3.6.8. Hãy ghi nhớ những thời điểm này là liên quan đến nhau, không tuyệt đối. Tôi chỉ mắc các bản sao nông, và cũng đã thêm một số phương pháp mới không thể xảy ra trong Python & nbsp; 2, chẳng hạn như new_list = list.copy()13 (Python & NBSP; 3 Slice tương đương) và hai hình thức danh sách giải nén (new_list = list.copy()58 và new_list = list.copy()59):
Lưu ý rằng các phương pháp này không đưa ra kết quả tương đương cho bất kỳ đầu vào nào ngoài danh sách. Tất cả chúng đều hoạt động cho các đối tượng có thể cắt xén, một số ít hoạt động cho bất kỳ điều gì có thể, nhưng chỉ 15 hoạt động cho các đối tượng Python tổng quát hơn.are significant performance issues using the 37 module and 81 for multidimensional lists.
Dưới đây là mã kiểm tra cho các bên quan tâm (mẫu từ đây):Jul 10, 2015 at 3:51
Đã trả lời ngày 5 tháng 4 năm 2017 lúc 1:01AMR Bờ sông1 gold badge6 silver badges16 bronze badges 3 8.26514 Huy hiệu vàng54 Huy hiệu bạc65 Huy hiệu Đồng Thành ngữ của Python để làm điều này là 65Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']1 Eriscoerisco Huy hiệu vàng 14K238 Huy hiệu bạc44 Huy hiệu đồng Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']2 Tất cả những người đóng góp khác đã đưa ra câu trả lời tuyệt vời, hoạt động khi bạn có một danh sách duy nhất (san bằng), tuy nhiên các phương pháp được đề cập cho đến nay, chỉ 18 hoạt động để sao chép/sao chép một danh sách và không chỉ ra các đối tượng 42 được lồng vào nhau khi Bạn đang làm việc với các danh sách đa chiều, lồng nhau (danh sách danh sách). Mặc dù Felix Kling đề cập đến nó trong câu trả lời của mình, có thêm một chút nữa cho vấn đề này và có thể là một cách giải quyết bằng cách sử dụng các bản dựng có thể chứng minh một sự thay thế nhanh hơn cho 36.Feb 26, 2018 at 2:33
Trong khi 69, 70 và đối với PY3K 71 làm việc cho các danh sách một cấp độ, chúng trở lại chỉ vào các đối tượng 42 được lồng trong 17 và 11, và thay đổi thành một trong các đối tượng 42.SCBChỉnh sửa: Thông tin mới được đưa ra ánh sáng1 gold badge34 silver badges41 bronze badges 2 Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']3 10Như đã được chỉ ra bởi cả Aaron Hall và PM 2ring sử dụng 76 không chỉ là một ý tưởng tồi, nó còn chậm hơn nhiều so với 18.Bây giờ nếu bạn gán 85, bạn chỉ cần sao chép từng đối tượng của my_list cho new_list. Điều này được gọi là một bản sao sâu.Những cách khác bạn có thể làm điều này là:
Cherrydt 23.4K3 Huy hiệu vàng43 Huy hiệu bạc69 Huy hiệu Đồng3 gold badges43 silver badges69 bronze badges Đã trả lời ngày 26 tháng 6 năm 2017 lúc 21:03Jun 26, 2017 at 21:03
Ravi Shankarravi ShankarRavi Shankar 1.6934 Huy hiệu vàng13 Huy hiệu bạc15 Huy hiệu Đồng4 gold badges13 silver badges15 bronze badges 1 Một cách tiếp cận rất đơn giản độc lập với phiên bản Python đã bị thiếu trong các câu trả lời đã được đưa ra mà bạn có thể sử dụng hầu hết thời gian (ít nhất là tôi làm): Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']6 Tuy nhiên, nếu my_list chứa các thùng chứa khác (ví dụ: danh sách lồng nhau), bạn phải sử dụng DeepCopy như những người khác được đề xuất trong các câu trả lời ở trên từ thư viện sao chép. Ví dụ: Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']7 .Bonus: nếu bạn không muốn sao chép các thành phần sử dụng (còn gọi là bản sao nông):Bonus: If you don't want to copy elements use (AKA shallow copy): Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']3 Hãy hiểu sự khác biệt giữa giải pháp #1 và giải pháp #2 Old List: [1, 2, 3, 'a'] New List: [1, 2, 3, 'a']9 Như bạn có thể thấy, Giải pháp số 1 đã hoạt động hoàn hảo khi chúng tôi không sử dụng danh sách lồng nhau. Hãy kiểm tra điều gì sẽ xảy ra khi chúng tôi áp dụng giải pháp số 1 cho danh sách lồng nhau. 0
Đã trả lời ngày 1 tháng 11 năm 2017 lúc 8:08Nov 1, 2017 at 8:08
Jainashishjainashishjainashish 4.1425 Huy hiệu vàng36 Huy hiệu bạc48 Huy hiệu đồng5 gold badges36 silver badges48 bronze badges Tôi muốn đăng một cái gì đó hơi khác so với một số câu trả lời khác. Mặc dù điều này rất có thể không phải là tùy chọn dễ hiểu nhất hoặc nhanh nhất, nhưng nó cung cấp một chút chế độ xem bên trong về cách sao chép sâu hoạt động, cũng như là một lựa chọn thay thế khác để sao chép sâu. Không thực sự quan trọng nếu chức năng của tôi có lỗi, vì điểm này là chỉ ra cách sao chép các đối tượng như câu trả lời câu hỏi, nhưng cũng sử dụng điều này như một điểm để giải thích cách thức hoạt động của DeepCopy ở cốt lõi của nó. Cốt lõi của bất kỳ chức năng sao chép sâu nào là cách tạo một bản sao nông. Làm sao? Giản dị. Bất kỳ chức năng sao chép sâu nào chỉ nhân đôi các thùng chứa của các đối tượng bất biến. Khi bạn DeepCopy một danh sách lồng nhau, bạn chỉ sao chép các danh sách bên ngoài, không phải là các đối tượng có thể thay đổi bên trong danh sách. Bạn chỉ đang nhân đôi các container. Các tác phẩm tương tự cho các lớp học, quá. Khi bạn DeepCopy một lớp, bạn DeepCopy tất cả các thuộc tính có thể thay đổi của nó. Rồi sao? Làm thế nào bạn chỉ phải sao chép các container, như danh sách, dicts, bộ dữ liệu, iters, lớp học và trường hợp lớp học? Nó đơn giản. Một đối tượng có thể thay đổi thực sự không thể được nhân đôi. Nó không bao giờ có thể được thay đổi, vì vậy nó chỉ là một giá trị duy nhất. Điều đó có nghĩa là bạn không bao giờ phải nhân đôi chuỗi, số, bools hoặc bất kỳ thứ nào trong số đó. Nhưng làm thế nào bạn sẽ nhân đôi các container? Giản dị. Bạn chỉ cần khởi tạo một thùng chứa mới với tất cả các giá trị. Deepcopy dựa vào đệ quy. Nó nhân đôi tất cả các container, ngay cả những container có các thùng chứa bên trong chúng, cho đến khi không còn container. Một container là một đối tượng bất biến. Một khi bạn biết điều đó, việc nhân đôi hoàn toàn một đối tượng mà không có bất kỳ tài liệu tham khảo nào là khá dễ dàng. Đây là một chức năng cho các loại dữ liệu cơ bản sâu sắc (sẽ không hoạt động cho các lớp tùy chỉnh nhưng bạn luôn có thể thêm điều đó) 1DeepCopy tích hợp của Python dựa trên ví dụ đó. Sự khác biệt duy nhất là nó hỗ trợ các loại khác và cũng hỗ trợ các lớp người dùng bằng cách sao chép các thuộc tính thành một lớp trùng lặp mới và cũng chặn Recursion vô hạn với tham chiếu đến một đối tượng mà nó đã thấy bằng danh sách ghi nhớ hoặc từ điển. Và đó thực sự là nó để tạo ra các bản sao sâu. Tại cốt lõi của nó, tạo ra một bản sao sâu chỉ là tạo ra các bản sao nông. Tôi hy vọng câu trả lời này sẽ thêm một cái gì đó vào câu hỏi. Ví dụ Nói rằng bạn có danh sách này: 86. Các số bất biến không thể được nhân đôi, nhưng lớp khác có thể. Bạn có thể sao chép nó bằng cách sử dụng danh sách hiểu: 87Bây giờ, hãy tưởng tượng bạn có danh sách này: 88. Lần này, bạn muốn tạo một hàm, sử dụng đệ quy để sao chép sâu tất cả các lớp của danh sách. Thay vì sự hiểu biết danh sách trước đó: 2Nó sử dụng một cái mới cho danh sách: 3Và DeepCopy_List trông như thế này:deepcopy_list looks like this: 4Sau đó, bây giờ bạn có một chức năng có thể làm sâu sắc bất kỳ danh sách các STRS, BOOLS, FLOAST, INT và thậm chí danh sách đến vô số lớp sử dụng đệ quy. Và ở đó bạn có nó, DeepCopying.strs, bools, floast, ints and even lists to infinitely many layers using recursion. And there you have it, deepcopying. TLDR: DeepCopy sử dụng đệ quy để nhân đôi các đối tượng và chỉ đơn thuần trả về các đối tượng bất biến giống như trước đây, vì các đối tượng bất biến không thể được nhân đôi. Tuy nhiên, nó sâu sắc các lớp bên trong nhất của các đối tượng có thể thay đổi cho đến khi nó đạt đến lớp đột biến ngoài cùng của một đối tượng.: Deepcopy uses recursion to duplicate objects, and merely returns the same immutable objects as before, as immutable objects cannot be duplicated. However, it deepcopies the most inner layers of mutable objects until it reaches the outermost mutable layer of an object. Đã trả lời ngày 8 tháng 9 năm 2019 lúc 2:25Sep 8, 2019 at 2:25
CormancormanCorman 6799 Huy hiệu bạc15 Huy hiệu Đồng9 silver badges15 bronze badges Lưu ý rằng có một số trường hợp nếu bạn đã xác định lớp tùy chỉnh của riêng mình và bạn muốn giữ các thuộc tính thì bạn nên sử dụng 15 hoặc 18 thay vì các lựa chọn thay thế, ví dụ như trong Python 3: 5Outputs: 6Đã trả lời ngày 16 tháng 5 năm 2018 lúc 14:31May 16, 2018 at 14:31
Chris_RandsChris_RandsChris_Rands 36.7K13 Huy hiệu vàng79 Huy hiệu bạc112 Huy hiệu đồng13 gold badges79 silver badges112 bronze badges Hãy nhớ rằng trong Python khi bạn làm: 7List2 không lưu trữ danh sách thực tế, mà là một tham chiếu đến List1. Vì vậy, khi bạn làm bất cứ điều gì với List1, List2 cũng thay đổi. Sử dụng mô -đun sao chép (không phải mặc định, tải xuống trên PIP) để tạo một bản gốc của danh sách (________ 115 cho danh sách đơn giản, 18 cho các bản lồng nhau). Điều này làm cho một bản sao không thay đổi với danh sách đầu tiên.Đã trả lời ngày 22 tháng 2 năm 2020 lúc 12:44Feb 22, 2020 at 12:44
Tiến sĩ Hippodr. Con hà mãDr. Hippo 612 Huy hiệu bạc5 Huy hiệu Đồng2 silver badges5 bronze badges Một quan điểm thực tế nhỏ để xem xét bộ nhớ thông qua ID và GC. 8Đã trả lời ngày 23 tháng 11 năm 2019 lúc 19:01Nov 23, 2019 at 19:01
B.Mr.W.B.Mr.W.B.Mr.W. 18.1K33 Huy hiệu vàng111 Huy hiệu bạc167 Huy hiệu đồng33 gold badges111 silver badges167 bronze badges Có một cách khác để sao chép một danh sách không được liệt kê cho đến bây giờ: thêm một danh sách trống: 93.Tôi đã thử nghiệm nó với Python 3.8: 9Nó không phải là câu trả lời tốt nhất, nhưng nó hoạt động.
Đã trả lời ngày 3 tháng 7 năm 2020 lúc 13:15Jul 3, 2020 at 13:15
1
Tùy chọn DeepCopy là phương pháp duy nhất phù hợp với tôi: Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']0 dẫn đến đầu ra của: Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']1 Đã trả lời ngày 11 tháng 4 năm 2020 lúc 11:19Apr 11, 2020 at 11:19
shahar_mshahar_mshahar_m 3.2955 Huy hiệu vàng40 Huy hiệu bạc59 Huy hiệu Đồng5 gold badges40 silver badges59 bronze badges 1 Điều này là do, dòng 10 gán một tham chiếu mới cho biến 12 là 11 Điều này tương tự như mã 97 được đưa ra dưới đây,Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']2 Bạn nên sử dụng mô -đun sao chép để tạo danh sách mới bằng cách Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']3 Đã trả lời ngày 4 tháng 6 năm 2020 lúc 10:40Jun 4, 2020 at 10:40
Roshin Raphelroshin RaphelRoshin Raphel 2.4993 huy hiệu vàng19 Huy hiệu bạc36 Huy hiệu đồng3 gold badges19 silver badges36 bronze badges Phương pháp sử dụng phụ thuộc vào nội dung của danh sách được sao chép. Nếu danh sách chứa 98 lồng nhau hơn DeepCopy là phương pháp duy nhất hoạt động, nếu không thì hầu hết các phương thức được liệt kê trong câu trả lời (lát, vòng lặp [cho], sao chép, mở rộng, kết hợp hoặc giải nén) sẽ hoạt động và thực hiện trong thời gian tương tự (ngoại trừ cho Loop và DeepCopy, đã tạo hình cho điều tồi tệ nhất).ScriptOld List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']4 Kết quảOld List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']5 Đã trả lời ngày 30 tháng 1 năm 2021 lúc 20:17Jan 30, 2021 at 20:17
fjemifjemifjemi Phù hiệu bằng đồng 2133 bronze badges Challenge Frame: Bạn có thực sự cần sao chép, cho ứng dụng của mình không?Tôi thường thấy mã cố gắng sửa đổi một bản sao của danh sách theo một số kiểu lặp. Để xây dựng một ví dụ tầm thường, giả sử chúng ta có mã không hoạt động (vì 99 không nên được sửa đổi) như:Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']6 Đương nhiên mọi người sẽ hỏi làm thế nào để làm cho 00 trở thành bản sao của 99, thay vì một tên cho cùng một danh sách, để vòng lặp 02 sẽ làm đúng.Nhưng đây là cách tiếp cận sai. Về mặt chức năng, những gì chúng tôi thực sự muốn làm là lập một danh sách mới dựa trên bản gốc.new list that is based on the original. Chúng ta không cần phải tạo một bản sao trước để làm điều đó, và chúng ta thường không nên. Khi chúng ta cần áp dụng logic cho từng phần tửCông cụ tự nhiên cho điều này là một danh sách hiểu. Bằng cách này, chúng tôi viết logic cho chúng tôi biết làm thế nào các yếu tố trong kết quả mong muốn, liên quan đến các yếu tố ban đầu. Nó đơn giản, thanh lịch và biểu cảm; Và chúng tôi tránh sự cần thiết của cách giải quyết để sửa đổi bản sao 00 trong vòng lặp 02 (vì việc gán cho biến lặp không ảnh hưởng đến danh sách - vì lý do tương tự mà chúng tôi muốn bản sao ngay từ đầu!).Đối với ví dụ trên, có vẻ như: Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']7 Danh sách toàn diện khá mạnh mẽ; Chúng ta cũng có thể sử dụng chúng để lọc ra các phần tử theo quy tắc với mệnh đề 05 và chúng ta có thể chuỗi các điều khoản 02 và 05 (nó hoạt động giống như mã bắt buộc tương ứng, với cùng một điều khoản theo cùng một thứ tự; chỉ có giá trị cuối cùng sẽ kết thúc Lên trong danh sách kết quả, được di chuyển ra phía trước thay vì ở phần "trong cùng"). Nếu kế hoạch được lặp lại trong bản gốc trong khi sửa đổi bản sao để tránh các vấn đề, thì nói chung có một cách dễ chịu hơn nhiều để làm điều đó với một danh sách lọc hiểu.Khi chúng ta cần từ chối hoặc chèn các yếu tố cụ thể theo vị tríGiả sử thay vào đó chúng ta có một cái gì đó giống như Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']8 Thay vì tạo 00 một bản sao riêng trước để xóa phần chúng tôi không muốn, chúng tôi có thể xây dựng một danh sách bằng cách kết hợp các phần mà chúng tôi muốn. Do đó:Old List: ['cat', 0, 6.7] New List: ['cat', 0, 6.7, 'dog']9 Xử lý chèn, thay thế, vv bằng cách cắt được để lại như một bài tập. Chỉ cần đưa ra lý do mà bạn muốn kết quả là kết quả. Một trường hợp đặc biệt của điều này là tạo một bản sao đảo ngược - giả sử chúng ta cần một danh sách mới (thay vì chỉ lặp ngược lại), chúng ta có thể trực tiếp tạo nó bằng cách cắt, thay vì nhân bản và sau đó sử dụng 09.Các cách tiếp cận này - như sự hiểu biết danh sách - cũng có lợi thế là chúng tạo ra kết quả mong muốn như một biểu thức, thay vì sửa đổi thủ tục một đối tượng hiện có tại chỗ (và trả về 10). Điều này thuận tiện hơn để viết mã theo phong cách "thông thạo".Đã trả lời ngày 23 tháng 9 lúc 17:19Sep 23 at 17:19
Karl Knechtelkarl KnechtelKarl Knechtel 59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu đồng10 gold badges86 silver badges132 bronze badges Giải thích ngắn và đơn giản về từng chế độ bản sao: 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ó cho các đối tượng được tìm thấy trong bản gốc - tạo một bản sao nông:shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original - creating a shallow copy: 0Mộ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 - tạo một bản sao sâu:deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original - creating a deep copy: 1 08 hoạt động tốt cho bản sao sâu của danh sách đơn giản, như: 2Nhưng, đối với các danh sách phức tạp như ... 3... Sử dụng 12: 4Đã trả lời ngày 15 tháng 10 lúc 1:15Oct 15 at 1:15
Fellipe Sanchesfellipe SanchesFellipe Sanches 6.4064 Huy hiệu vàng29 Huy hiệu bạc 30 Huy hiệu Đồng4 gold badges29 silver badges30 bronze badges 2 Làm thế nào bạn có thể sao chép một danh sách trong Python?Bản sao danh sách Python ().. Sao chép () Cú pháp. Cú pháp của phương thức Copy () là: new_list = list.copy (). Sao chép () tham số. Phương thức bản sao () không lấy bất kỳ tham số nào .. Sao chép () Giá trị trả về. Phương thức bản sao () trả về một danh sách mới. .... Ví dụ: Sao chép một danh sách. # Danh sách hỗn hợp my_list = ['Cat', 0, 6.7] .... Danh sách bản sao bằng cách sử dụng =. Làm thế nào để bạn sao chép một danh sách này sang danh sách khác?Một danh sách các yếu tố có thể được sao chép vào danh sách khác bằng nhiều cách ... Cách số 1.Tạo một danh sách bằng cách chuyển một danh sách khác như một đối số của hàm tạo..... Cách số 2.Danh sách copyoflist = new ArrayList ();CopyofList.Addall (Danh sách) ;. Cách số 3.Sử dụng bộ sưu tập..... Cách số 4.Sử dụng các luồng để tạo một bản sao của một danh sách..... Thí dụ..... Output.. Sao chép () Python là gì?Phương thức Danh sách Python () trả về một bản sao nông của danh sách (trả về danh sách mới mà không sửa đổi danh sách ban đầu).return a shallow copy of a list(returns a new list without modifying the original lists).
Làm thế nào để bạn lặp lại một danh sách trong Python?Sử dụng toán tử * Toán tử * cũng có thể được sử dụng để lặp lại các phần tử của danh sách.Khi chúng tôi nhân danh sách với bất kỳ số nào bằng toán tử *, nó sẽ lặp lại các phần tử của danh sách đã cho.
The * operator can also be used to repeat elements of a list. When we multiply a list with any number using the * operator, it repeats the elements of the given list. |