Hướng dẫn is dict immutable in python - là không thể thay đổi được trong python

Các loại bộ sưu tập tích hợp 2022-01-05Python, có hương vị có thể thay đổi và bất biến, nhưng một người bị thiếu một cách dễ thấy:
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:

Phiên bản có thể thay đổiPhiên bản bất biến
listtuple
________số 8frozenset
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
???

Đâ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 assignment
0:

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 thrid

Có 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ây

Có 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:

  • Mẫu tập lệnh Python với các lệnh phụ (và gõ gợi ý)
  • Cách tạo bí danh thuộc tính minh bạch trong Python
  • Bài kiểm tra được bảo trì tốt: 12 câu hỏi cho các phụ thuộc mới

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.