Hướng dẫn how do i copy a dictionary in python? - làm cách nào để sao chép từ điển trong python?
Trong hướng dẫn này, chúng tôi sẽ tìm hiểu về phương thức Python Dictionary Copy () với sự trợ giúp của các ví dụ. Show
Họ Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}8 Phương thức trả về một bản sao (bản sao nông) của từ điển. Thí dụ
Cú pháp của bản sao từ điển ()Cú pháp của Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}8 là: dict.copy() sao chép () đối sốPhương pháp Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}8 không lấy bất kỳ đối số nào. sao chép () giá trị trả vềPhương pháp này trả về một bản sao nông của từ điển. Nó không sửa đổi từ điển ban đầu. Ví dụ 1: Sao chép hoạt động như thế nào cho từ điển?
Đầu ra Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'} Phương thức bản sao từ điển () Phương thức vs = toán tửKhi phương thức Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}8 được sử dụng, một từ điển mới được tạo ra chứa đầy một bản sao của các tài liệu tham khảo từ từ điển gốc. Khi toán tử 2 được sử dụng, một tham chiếu mới về từ điển ban đầu được tạo.Ví dụ 2: Sử dụng = toán tử để sao chép từ điển
Đầu ra new: {} original: {} Phương thức bản sao từ điển () Phương thức vs = toán tử Khi phương thức Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}8 được sử dụng, một từ điển mới được tạo ra chứa đầy một bản sao của các tài liệu tham khảo từ từ điển gốc.
Đầu ra new: {} original: {1: 'one', 2: 'two'} Phương thức bản sao từ điển () Phương thức vs = toán tử Python không bao giờ ngầm sao chép các đối tượng. Khi bạn đặt 3, bạn đang làm cho chúng đề cập đến cùng một đối tượng Dict chính xác, vì vậy khi bạn đột biến nó, tất cả các tham chiếu đến nó tiếp tục đề cập đến đối tượng trong trạng thái hiện tại của nó.Nếu bạn muốn sao chép Dict (rất hiếm), bạn phải làm điều đó một cách rõ ràng với
hoặc
Đã trả lời ngày 17 tháng 3 năm 2010 lúc 21:09Mar 17, 2010 at 21:09
Mike Grahammike GrahamMike Graham 71.4K14 Huy hiệu vàng98 Huy hiệu bạc129 Huy hiệu đồng14 gold badges98 silver badges129 bronze badges 32 Khi bạn gán 3, bạn sẽ không tạo một bản sao của 5, nó sẽ dẫn đến 6 chỉ là một tên khác cho 5.Để sao chép các loại có thể thay đổi như từ điển, hãy sử dụng 8 / 9 của mô -đun 8.dict.copy()0 Đã trả lời ngày 17 tháng 3 năm 2010 lúc 21:11Mar 17, 2010 at 21:11
8 Trong khi new: {} original: {}1 và new: {} original: {}2 tạo ra một bản sao, chúng chỉ là các bản sao nông. Nếu bạn muốn một bản sao sâu, new: {} original: {}3 là bắt buộc. Một ví dụ: dict.copy()1 Liên quan đến các bản sao sâu so với các bản sao sâu, từ các tài liệu mô -đun Python 8:
Alukach 5.1823 Huy hiệu vàng37 Huy hiệu bạc38 Huy hiệu Đồng3 gold badges37 silver badges38 bronze badges Đã trả lời ngày 12 tháng 3 năm 2014 lúc 3:23Mar 12, 2014 at 3:23
gpandagpandagpanda 3.0221 Huy hiệu vàng13 Huy hiệu bạc12 Huy hiệu đồng1 gold badge13 silver badges12 bronze badges 4 Về chiều sâu và một cách dễ nhớ: Bất cứ khi nào bạn làm Dict2 = Dict1, Dict2 đề cập đến Dict1. Cả Dict1 và Dict2 đều chỉ vào cùng một vị trí trong bộ nhớ. Đây chỉ là một trường hợp bình thường trong khi làm việc với các đối tượng có thể thay đổi trong Python. Khi bạn đang làm việc với các đối tượng có thể thay đổi trong Python, bạn phải cẩn thận vì khó gỡ lỗi. Thay vì sử dụng dict2 = dict1, bạn nên sử dụng bản sao (bản sao nông) và phương thức DeepCopy từ mô -đun bản sao của Python để tách Dict2 khỏi Dict1.copy(shallow copy) and deepcopy method from python's copy module to separate dict2 from dict1. Cách chính xác là: dict.copy()2 Như bạn có thể thấy ID của cả Dict1 và Dict2 là khác nhau, điều đó có nghĩa là cả hai đều đang chỉ/tham chiếu đến các vị trí khác nhau trong bộ nhớ.id of both dict1 and dict2 are different, which means both are pointing/referencing to different locations in the memory. Giải pháp này hoạt động cho các từ điển với các giá trị bất biến, đây không phải là giải pháp chính xác cho những người có giá trị đột biến. Eg: dict.copy()3 Bạn có thể thấy rằng mặc dù chúng tôi đã áp dụng bản sao cho dict1, giá trị của đột biến được thay đổi thành sai trên cả dict2 và dict1 mặc dù chúng tôi chỉ thay đổi nó trên dict2. Điều này là do chúng tôi đã thay đổi giá trị của một phần dict có thể thay đổi của dict1. Khi chúng tôi áp dụng một bản sao trên Dict, nó sẽ chỉ thực hiện một bản sao nông, điều đó có nghĩa là nó sao chép tất cả các giá trị bất biến thành một dict mới và không sao chép các giá trị có thể thay đổi nhưng nó sẽ tham chiếu chúng. Giải pháp cuối cùng là thực hiện một sự sâu sắc của dict1 để tạo ra hoàn toàn một tài sản mới với tất cả các giá trị được sao chép, bao gồm các giá trị có thể thay đổi. dict.copy()4 Như bạn có thể thấy, ID là khác nhau, điều đó có nghĩa là Dict2 hoàn toàn là một độc lực mới với tất cả các giá trị trong Dict1. DeepCopy cần được sử dụng nếu bất cứ khi nào bạn muốn thay đổi bất kỳ giá trị có thể thay đổi nào mà không ảnh hưởng đến dict ban đầu. Nếu không bạn có thể sử dụng bản sao nông. DeepCopy chậm vì nó hoạt động đệ quy để sao chép bất kỳ giá trị lồng nào trong Dict ban đầu và cũng có thêm bộ nhớ. Đã trả lời ngày 31 tháng 7 năm 2017 lúc 13:26Jul 31, 2017 at 13:26
VkreddyvkreddyVkreddy 1.53815 huy hiệu bạc13 huy hiệu đồng15 silver badges13 bronze badges Trên Python 3.5+, có một cách dễ dàng hơn để đạt được một bản sao nông bằng cách sử dụng toán tử ** giải nén. Được xác định bởi PEP 448. dict.copy()5 ** Giải nén từ điển vào một từ điển mới sau đó được gán cho Dict2. Chúng tôi cũng có thể xác nhận rằng mỗi từ điển có ID riêng biệt. dict.copy()6 Nếu cần một bản sao sâu thì hãy sao chép.DeepCopy () vẫn là con đường để đi. Đã trả lời ngày 12 tháng 9 năm 2017 lúc 15:39Sep 12, 2017 at 15:39
PABTORREPABTORREPabTorre 2.73920 Huy hiệu bạc 30 Huy hiệu Đồng20 silver badges30 bronze badges 7 Những cách tốt nhất và dễ nhất để tạo một bản sao của một dict trong cả Python 2.7 và 3 là ...dict in both Python 2.7 and 3 are... Để tạo một bản sao của Từ điển đơn giản (cấp độ đơn): 1. Sử dụng phương thức Dict (), thay vì tạo một tham chiếu trỏ đến Dict hiện có. Using dict() method, instead of generating a reference that points to the existing dict. dict.copy()7 2. Sử dụng phương thức Cập nhật () của từ điển Python tích hợp. Using the built-in update() method of python dictionary. dict.copy()8 Để tạo một bản sao từ điển lồng nhau hoặc phức tạp: Sử dụng mô-đun sao chép tích hợp, cung cấp các hoạt động sao chép nông và sâu. Mô -đun này có mặt trong cả Python 2.7 và 3.*copy module, which provides a generic shallow and deep copy operations. This module is present in both Python 2.7 and 3.* dict.copy()9 Đã trả lời ngày 21 tháng 5 năm 2018 lúc 10:14May 21, 2018 at 10:14
Akay Niralaakay NiralaAkay Nirala 1.1067 Huy hiệu bạc13 Huy hiệu Đồng7 silver badges13 bronze badges 2 Bạn cũng có thể làm một từ điển mới với sự hiểu biết từ điển. Điều này tránh nhập bản sao. 0Tất nhiên trong Python> = 2.7 Bạn có thể làm: 1Nhưng đối với compat ngược., Phương pháp hàng đầu là tốt hơn. Đã trả lời ngày 6 tháng 3 năm 2014 lúc 3:28Mar 6, 2014 at 3:28
4 Ngoài các giải pháp được cung cấp khác, bạn có thể sử dụng new: {} original: {}5 để tích hợp từ điển vào một từ điển trống, ví dụ:
Bây giờ bạn sẽ có một bản sao "nông" của new: {} original: {}7. Áp dụng cho ví dụ của bạn: 2Con trỏ: Sự khác biệt giữa các copys nông và sâu Đã trả lời ngày 21 tháng 11 năm 2018 lúc 13:46Nov 21, 2018 at 13:46
d4rtyd4rtyd4rty 3.7605 Huy hiệu vàng29 Huy hiệu bạc68 Huy hiệu Đồng5 gold badges29 silver badges68 bronze badges 2 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. Vì vậy, 3, nó dẫn đến một ràng buộc khác giữa 6 và đối tượng mà 5 đề cập đến.Nếu bạn muốn sao chép một dict, bạn có thể sử dụng 1. Mô -đun sao chép có hai giao diện: 3Sự 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.shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original. 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.deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original. Ví dụ, trong Python 2.7.9: 4và kết quả là: 5Đã trả lời ngày 10 tháng 12 năm 2016 lúc 12:25Dec 10, 2016 at 12:25
nới lỏngloosen 3112 Huy hiệu bạc4 Huy hiệu đồng2 silver badges4 bronze badges Bạn có thể sao chép và chỉnh sửa bản sao mới được xây dựng trong một lần bằng cách gọi hàm xây dựng 2 với các đối số từ khóa bổ sung: 6Đã trả lời ngày 25 tháng 10 năm 2016 lúc 12:41Oct 25, 2016 at 12:41
Frerich Raabefrerich RaabeFrerich Raabe 88.2K18 Huy hiệu vàng112 Huy hiệu bạc206 Huy hiệu đồng18 gold badges112 silver badges206 bronze badges 1
Điều này cũng làm tôi bối rối, ban đầu, bởi vì tôi đến từ một nền C. Trong C, một biến là một vị trí trong bộ nhớ có loại được xác định. Gán cho một biến sao chép dữ liệu vào vị trí bộ nhớ của biến. Nhưng trong Python, các biến hoạt động giống như con trỏ đến các đối tượng. Vì vậy, việc gán một biến cho một biến khác không tạo một bản sao, nó chỉ làm cho tên biến đó trỏ đến cùng một đối tượng. Đã trả lời ngày 18 tháng 3 năm 2010 lúc 0:39Mar 18, 2010 at 0:39
Craig McQueencraig McQueenCraig McQueen 40.5K28 Huy hiệu vàng122 Huy hiệu bạc178 Huy hiệu đồng28 gold badges122 silver badges178 bronze badges 3 5 là một biểu tượng tham chiếu một đối tượng từ điển cơ bản. Gán 5 cho 6 chỉ gán cùng một tham chiếu. Thay đổi giá trị của khóa thông qua ký hiệu 6 thay đổi đối tượng cơ bản, cũng ảnh hưởng đến 5. Điều này thật khó hiểu.Lý do dễ dàng hơn nhiều về các giá trị bất biến so với các tài liệu tham khảo, vì vậy hãy tạo bản sao bất cứ khi nào có thể: 7Điều này là về mặt cú pháp giống như: 8Đã trả lời ngày 23 tháng 12 năm 2016 lúc 16:58Dec 23, 2016 at 16:58
Petrus Theronpetrus TheronPetrus Theron 27K35 Huy hiệu vàng147 Huy hiệu bạc279 Huy hiệu đồng35 gold badges147 silver badges279 bronze badges Mỗi biến trong Python (những thứ như 5 hoặc 9 hoặc new: {} original: {1: 'one', 2: 'two'}0 là một con trỏ của một số "đối tượng" ở một số "đối tượng" ẩn bên trong máy. Nếu bạn đặt ____ 71, bạn chỉ cần trỏ 5 vào cùng một đối tượng (hoặc vị trí bộ nhớ hoặc bất kỳ tương tự nào bạn thích) là 6. Bây giờ, đối tượng được tham chiếu bởi 5 là cùng một đối tượng được tham chiếu bởi 6.Bạn có thể kiểm tra: new: {} original: {1: 'one', 2: 'two'}6 phải là new: {} original: {1: 'one', 2: 'two'}7. Ngoài ra, new: {} original: {1: 'one', 2: 'two'}8 phải giống như new: {} original: {1: 'one', 2: 'two'}9. Bạn muốn 0 hoặc 1.Sự khác biệt giữa 8 và 9? 9 sẽ đảm bảo rằng các yếu tố của 6 (bạn đã chỉ nó vào danh sách?) Cũng là bản sao.Tôi không sử dụng 9 nhiều - thường là thực hành kém để viết mã cần nó (theo ý kiến của tôi).Đã trả lời ngày 17 tháng 3 năm 2010 lúc 23:57Mar 17, 2010 at 23:57
Wistywistywisty 6,9071 Huy hiệu vàng29 Huy hiệu bạc29 Huy hiệu đồng1 gold badge29 silver badges29 bronze badges 1 3 không sao chép từ điển. Nó chỉ đơn giản là cung cấp cho bạn lập trình một cách thứ hai ( 6) để đề cập đến cùng một từ điển.Đã trả lời ngày 17 tháng 3 năm 2010 lúc 21:09Mar 17, 2010 at 21:09 9Có nhiều cách để sao chép đối tượng Dict, tôi chỉ sử dụng Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}0 Đã trả lời ngày 30 tháng 9 năm 2018 lúc 14:59Sep 30, 2018 at 14:59
imcaoziimcaoziimcaozi 1071 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges 2 Mã sau đây, trên Dicts, sau cú pháp JSON nhanh hơn 3 lần so với DeepCopy Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}1
xaxxon Phim huy hiệu vàng 18,8K44 gold badges49 silver badges80 bronze badges Đã trả lời ngày 29 tháng 7 năm 2019 lúc 12:45Jul 29, 2019 at 12:45
Đối với từ điển lồng nhau không sử dụng 9 vì nếu bạn thay đổi cấp độ thứ hai và nhiều hơn nữa, nó cũng sẽ sửa đổi từ điển nguồnOrignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}2 Một tùy chọn khác cho DeepCopy là sử dụng thủ thuật 0 như JavaScript 1Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}3 Đã trả lời ngày 11 tháng 8 lúc 3:41Aug 11 at 3:41
UingTeaUingTeauingtea 5.4382 Huy hiệu vàng20 Huy hiệu bạc37 Huy hiệu đồng2 gold badges20 silver badges37 bronze badges Như những người khác đã giải thích, 2 tích hợp không làm những gì bạn muốn. Nhưng trong Python2 (và có lẽ 3 cũng vậy), bạn có thể dễ dàng tạo một lớp 3 sao chép với 2 để bạn có thể chắc chắn rằng bản gốc sẽ không thay đổi.Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}4 Vui lòng tham khảo mẫu sửa đổi Lvalue được thảo luận ở đây: Python 2.7 - Cú pháp sạch để sửa đổi Lvalue. Quan sát chính là 9 và 6 hoạt động như các giá trị trong Python (mặc dù chúng thực sự là các đối tượng bất biến dưới mui xe). Trong khi bạn đang quan sát điều đó, xin vui lòng quan sát rằng không có gì đặc biệt kỳ diệu về 9 hoặc 6. 2 có thể được sử dụng theo nhiều cách tương tự và tôi có thể nghĩ về nhiều trường hợp 3 có ý nghĩa.Đã trả lời ngày 16 tháng 9 năm 2017 lúc 23:09Sep 16, 2017 at 23:09
personal_cloudpersonal_cloudpersonal_cloud 3.6703 Huy hiệu vàng25 Huy hiệu bạc32 Huy hiệu Đồng3 gold badges25 silver badges32 bronze badges Tôi đã gặp một hành vi đặc biệt khi cố gắng sao chép sâu thuộc tính từ điển của lớp w/o gán nó cho biến dict.copy()01 không hoạt động, tức là sửa đổi dict.copy()02 sửa đổi dict.copy()03 Nhưng nếu bạn làm dict.copy()04 và sau đó dict.copy()05, nó hoạt động hoàn hảo, tức là sửa đổi dict.copy()02 không ảnh hưởng đến dict.copy()03 Tôi không chắc tại sao điều này xảy ra, nhưng hy vọng nó sẽ giúp tiết kiệm một số giờ! :) Đã trả lời ngày 24 tháng 11 năm 2019 lúc 4:52Nov 24, 2019 at 4:52
AnushkanushkAnushk 4624 Huy hiệu bạc20 Huy hiệu Đồng4 silver badges20 bronze badges 2 Sao chép bằng cách sử dụng một vòng lặp cho: Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}5 Đã trả lời ngày 23 tháng 1 năm 2020 lúc 19:42Jan 23, 2020 at 19:42
3 Bạn có thể sử dụng trực tiếp: Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}6 Trong đó đối tượng dict2 là một bản sao độc lập của dict1, vì vậy bạn có thể sửa đổi dict2 mà không ảnh hưởng đến dict1. Điều này làm việc cho bất kỳ loại đối tượng. Đã trả lời ngày 2 tháng 8 năm 2017 lúc 10:21Aug 2, 2017 at 10:21
VIIIKVIIIKViiik 132 Huy hiệu đồng2 bronze badges 2 Một cách sạch sẽ khác sẽ được sử dụng JSON. Xem mã bên dưới Orignal: {1: 'one', 2: 'two'} New: {1: 'one', 2: 'two'}7 Để tạo một từ điển khác, do json.dumps () và sau đó json.loads () trên cùng một đối tượng từ điển. Bạn sẽ có đối tượng Dict riêng biệt. Đã trả lời ngày 10 tháng 12 năm 2020 lúc 10:25Dec 10, 2020 at 10:25
OnkaronkarOnkar 2293 Huy hiệu bạc9 Huy hiệu Đồng3 silver badges9 bronze badges 1 Từ điển có thể được sao chép không?Từ điển cũng có thể được sao chép bằng toán tử = trỏ đến cùng một đối tượng với bản gốc.Vì vậy, nếu có bất kỳ thay đổi nào được thực hiện trong từ điển sao chép cũng sẽ phản ánh trong từ điển gốc., which points to the same object as the original. So if any change is made in the copied dictionary will also reflect in the original dictionary.
Làm cách nào để tạo một bản sao sâu của một từ điển?Để tạo một bản sao sâu, hãy sử dụng hàm DeepCopy () của mô -đun sao chép.Trong một bản sao sâu, các bản sao được chèn thay vì các tham chiếu đến các đối tượng, do đó, việc thay đổi cái này không thay đổi cái kia.Sau đây là một ví dụ về việc áp dụng hàm DeepCopy () cho một lát cắt.use the deepcopy() function of the copy module. In a deep copy, copies are inserted instead of references to objects, so changing one does not change the other. The following is an example of applying the deepcopy() function to a slice.
Copy () làm gì trong Python?Định nghĩa và cách sử dụng.Phương thức Copy () trả về một bản sao của danh sách được chỉ định.returns a copy of the specified list.
Làm thế nào để bạn nhân đôi một khóa từ điển?Nếu bạn muốn giữ các khóa trùng lặp trong từ điển, bạn có hai hoặc nhiều giá trị khác nhau mà bạn muốn liên kết với cùng một khóa trong từ điển.Từ điển không thể có cùng các khóa, nhưng chúng ta có thể đạt được hiệu ứng tương tự bằng cách giữ nhiều giá trị cho một khóa trong từ điển.you have two or more different values that you want to associate with same key in dictionary. The dictionary can not have the same keys, but we can achieve a similar effect by keeping multiple values for a key in the dictionary. |