Hướng dẫn is dict immutable in python - là không thể thay đổi được trong python
Python’s built-in collection types come in mutable and immutable flavours, but one is conspicuously missing: Show
Đâu là ____ ____1111? Nó có thể hữu ích… PEP 416 đã đề xuất một loại In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']1 cho Python 3.3, vào năm 2012. PEP đã bị từ chối, vì một số lý do chính đáng. Lý do bao gồm một số câu hỏi về tiện ích của một dict bất biến, đáng để kiểm tra trước khi bạn thêm chúng vào mã của mình. Nhưng PEP đã cung cấp cho chúng tôi một công cụ để mô phỏng các ____10s bất biến: In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']4. Loại này là một proxy chỉ đọc cho ____10 hoặc ánh xạ khác. Python sử dụng loại này trong nội bộ cho các từ điển quan trọng, đó là lý do tại sao bạn có thể các loại tích hợp khỉ tích. Thay đổi duy nhất trong Python 3.3 là để hiển thị loại này cho mã người dùng. . Cách sử dụng In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny'] 8Để tạo ra một chế độ bất biến của người Viking, hãy tạo ra một In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']8 từ dict from types import MappingProxyType power_levels = MappingProxyType( { "Kevin": 9001, "Benny": 8000, } ) Bạn có thể đọc từ proxy ánh xạ với tất cả các phương pháp thông thường: In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny'] Nhưng, mọi nỗ lực thay đổi giá trị sẽ dẫn đến In [4]: power_levels["Benny"] = 9200 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-39fccb3e4f76> in <module> ----> 1 power_levels["Benny"] = 9200 TypeError: 'mappingproxy' object does not support item assignment0: In [4]: power_levels["Benny"] = 9200 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-39fccb3e4f76> in <module> ----> 1 power_levels["Benny"] = 9200 TypeError: 'mappingproxy' object does not support item assignment Noice. Vì không có tài liệu tham khảo nào về In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']0 cơ bản, nó không thể thay đổi. In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']0 có thể truy cập được thông qua bất kỳ thuộc tính nào trên In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']8 hoặc chỉ có tham chiếu chỉ có trong một con trỏ cấp C vô hình. Nếu bạn giữ lại một tham chiếu đến In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']0 trong biến thứ hai, bất kỳ đột biến nào của nó sẽ hiển thị trong proxy: In [5]: original = {"kevin": 9001} In [6]: proxy = MappingProxyType(original) In [7]: proxy["kevin"] Out[7]: 9001 In [8]: original["kevin"] = 9002 In [9]: proxy["kevin"] Out[9]: 9002 Cách tạo các bản sao đột biếnĐể tạo một bản sao của proxy ánh xạ bằng các thay đổi, bạn có thể sử dụng toán tử Merge Dict Python 3.9. Hợp nhất proxy ánh xạ với một dict mới và chuyển kết quả cho In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']8: In [10]: benny_better = MappingProxyType(power_levels | {"Benny": 9200}) In [11]: benny_better Out[11]: mappingproxy({'Kevin': 9001, 'Benny': 9200}) Để sửa đổi phức tạp hơn, bạn có thể sao chép proxy ánh xạ vào một ____10 mới, thực hiện các thay đổi và sau đó chuyển đổi kết quả thành proxy ánh xạ: In [12]: new_world = power_levels | {} In [13]: del new_world["Benny"] In [14]: del new_world["Kevin"] In [15]: new_world["Bock"] = 100 In [16]: new_world = MappingProxyType(new_world) In [17]: new_world Out[17]: mappingproxy({'Bock': 100}) Yabba-dabba-doo! Gói bữa tiệc thridCó một số gói bên thứ ba cung cấp các cấu trúc dữ liệu bất biến, chẳng hạn như bất biến và pyrsistent. Chúng có API API đẹp hơn một chút, nhưng đi kèm với các sự đánh đổi khác nhau như hiệu suất và trạng thái bảo trì. Bạn có thể muốn nghiên cứu chúng nếu In [1]: power_levels["Kevin"] Out[1]: 9001 In [2]: power_levels["Benny"] Out[2]: 8000 In [3]: list(power_levels.keys()) Out[3]: ['Kevin', 'Benny']8 không làm việc cho bạn, nhưng tôi đã khuyến khích sử dụng thư viện tiêu chuẩn càng nhiều càng tốt. VâyCó thể dữ liệu của bạn chỉ đột biến khi bạn muốn nó, —Adam Tìm hiểu làm thế nào để làm cho các bài kiểm tra của bạn chạy nhanh chóng trong cuốn sách của tôi tăng tốc các bài kiểm tra django của bạn. Một email tóm tắt một tuần, không spam, tôi pinky hứa. Bài viết liên quan:
Tags: Python python Là một dict bất biến?Bản thân từ điển là có thể thay đổi, vì vậy các mục có thể được thêm, loại bỏ và thay đổi bất cứ lúc nào., so entries can be added, removed, and changed at any time.
Là một con trăn bất biến từ điển?Thứ hai, một khóa từ điển phải thuộc loại bất biến.Ví dụ: bạn có thể sử dụng số nguyên, phao, chuỗi hoặc boolean làm khóa từ điển.Tuy nhiên, cả danh sách và từ điển khác đều không thể đóng vai trò là khóa từ điển, bởi vì danh sách và từ điển đều có thể thay đổi.a dictionary key must be of a type that is immutable. For example, you can use an integer, float, string, or Boolean as a dictionary key. However, neither a list nor another dictionary can serve as a dictionary key, because lists and dictionaries are mutable.
Chúng ta có thể làm cho từ điển bất biến trong Python không?Không, nó không thể.Đối tượng có thể được tạo ra có thể thay đổi (hoặc không) bất kể phương pháp __hash__ của nó làm gì.. The object can be made mutable (or not) irrespective of what its __hash__ method does.
Tại sao Dict Keys là Python bất biến?Tại sao các phím từ điển phải là bất biến?Việc thực hiện bảng băm của từ điển sử dụng giá trị băm được tính từ giá trị khóa để tìm khóa.Nếu khóa là một đối tượng có thể thay đổi, giá trị của nó có thể thay đổi và do đó hàm băm của nó cũng có thể thay đổi.If the key were a mutable object, its value could change, and thus its hash could also change. |