Python中TypeError:unhashable type:'dict'錯誤如何解決
Python “TypeError: unhashable type: ‘dict’ ” 發生在我們將字典用作另一個字典中的鍵或用作集合中的元素時。
要解決該錯誤,需要改用 frozenset
,或在將字典用作鍵之前將其轉換為 JSON 字串。
當我們將字典用作另一個字典中的鍵時,會發生錯誤。
# ????️ using dictionary as a key in a dictionary # ⛔️ TypeError: unhashable type: 'dict' my_dict = {'name': 'Jiyik', {'country': 'China'}: 'address'}
或當我們使用字典作為 set
物件中的元素。
# ????️ 使用字典作为集合中的元素 # ⛔️ TypeError: unhashable type: 'dict' my_set = {{'name': 'Jiyik'}}
我們不能將字典用作字典中的鍵或集合中的元素,因為字典物件是可變的和不可散列的。
將字典轉為JSON字串解決報錯
解決該錯誤的一種方法是在將字典用作鍵之前將其轉換為 JSON 字串。
import json # ????️ 将字典转换为 JSON 字符串 my_json = json.dumps({'country': 'China'}) my_dict = {'name': 'Jiyik', my_json: 'address'} print(my_dict) # ????️ {'name': 'Jiyik', '{"country": "China"}': 'address'} # ????️ 当你必须访问字典中的键时 print(my_dict[json.dumps({'country': 'Austria'})]) # ????️ address
json.dumps
方法將 Python 物件轉換為 JSON 格式的字串。這是有效的,因為字串是不可變的和可散列的。
相反,json.loads
方法將 JSON 字串解析為本機 Python 對象,例如 my_dict = json.loads(my_json_str)
。
使用 frozenset 解決錯誤
解決錯誤的另一種方法是使用 frozenset
。
my_key = {'country': 'China'} key = frozenset(my_key.items()) print(key) # ????️ frozenset({('country', 'China')}) my_dict = {'name': 'Jiyik', key: 'address'} # ????️ 当我们必须访问 key 时 print(my_dict[frozenset(my_key.items())]) # ????️ 'address'
dict.items
方法傳回字典項目((鍵,值)對)的新視圖。
# ????️ dict_items([('name', 'jiyik'), ('age', 30)]) print({'name': 'jiyik', 'age': 30}.items())
我們使用字典的項目創建了一個 frozenset
,我們可以將其用作字典中的鍵(以及另一個集合中的元素)。
frozenset
是 Python 集合物件的不可變版本,因此它可以用作字典中的鍵或另一個集合中的元素。
請注意 ,我們必須使用相同的方法來存取字典中的鍵。
我們可以將呼叫 frozenset(my_key.items())
的結果儲存在變數中,並在設定或存取字典中的鍵時重複使用 frozenset。
將字典轉換為元組以解決錯誤
解決錯誤的另一種方法是將字典轉換為元組。
dict_key = {'id': 1, 'country': 'China'} # ✅ 转换为元组 my_tuple = tuple(dict_key) print(my_tuple) # ????️ ('id', 'country') my_dict = {'name': 'Jiyik', my_tuple: 'address'} print(my_dict) # ????️ {'name': 'Jiyik', ('id', 'country'): 'address'} # ????️ 当你必须访问字典中的键时 print(my_dict[my_tuple]) # ????️ address
將字典轉換為元組時,元組僅包含字典的鍵。
元組是不可變的,因此包含字典鍵的元組可以安全地用作另一個字典中的鍵。
使用一個字典作為另一個字典中的值
我們不能將一個字典用作另一個字典中的鍵,但可以將一個字典用作值。
dict_value = {'id': 1, 'country': 'China'} my_dict = {'name': 'Jiyik', 'data': dict_value} # ????️ {'name': 'Jiyik', 'data': {'id': 1, 'country': 'China'}} print(my_dict) print(my_dict['data']) # ????️ {'id': 1, 'country': 'China'}
我們將一個字典設定為另一個字典中的值。
這是允許的,因為限制不適用於字典值。
將一個字典的所有鍵值對加到另一個字典
如果需要將一個字典的所有鍵值對新增到另一個字典,則可以使用 for 迴圈。
another_dict = {'id': 1, 'country': 'China'} my_dict = {'name': 'Jiyik'} for key, value in another_dict.items(): my_dict[key] = value # ????️ {'name': 'Jiyik', 'id': 1, 'country': 'China'} print(my_dict)
dict.items
方法傳回字典項目((鍵,值)對)的新視圖。
my_dict = {'id': 1, 'name': 'Jiyik'} # ????️ dict_items([('id', 1), ('name', 'Jiyik')]) print(my_dict.items())
在每次迭代中,我們將鍵值對設定為另一個字典。
Python 中的可散列物件與不可散列物件
Python 中的大多數不可變內建物件都是可散列的,而可變物件是不可散列的。
如果一個物件是可散列的,那麼它可以用作字典中的鍵和集合中的元素,因為這些資料結構在內部使用雜湊值。
可雜湊物件包括- str 、int 、bool 、tuple 、 frozenset。
不可散列的物件包括 - list 、dict 、set。
請注意
,元組和凍結集合僅在其元素可雜湊時才可雜湊。
檢查一個物件是否可散列
我們可以透過將物件傳遞給內建的 hash()
函數來檢查物件是否可散列。
print(hash('jiyik.com')) # ????️ 4905958875846995527 # ⛔️ TypeError: unhashable type: 'dict' print(hash({'name': 'Jiyik'}))
雜湊函數傳回傳入物件的雜湊值(如果有的話)。
雜湊值是整數,用於在字典尋找期間比較字典鍵。
!> 可散列物件的雜湊值在其生命週期內永遠不會改變。這就是為什麼大多數不可變物件是可哈希的,而可變物件是不可哈希的。
像字典這樣的物件是可變的,因為字典的內容可以改變。
my_dict = {'name': 'Fql'} my_dict['name'] = 'Jiyik' print(my_dict) # ????️ {'name': 'Jiyik'}
另一方面,包含原始值的 fronzenset
和元組物件是不可變的(和可散列的)。
字典由鍵索引,字典中的鍵可以是任何不可變類型,例如 字串或數字。
如果元組包含字串、數字或元組,則它們只能用作字典中的鍵。
如果 fronzenset
或元組包含可變物件(例如列表),則不能將其用作字典中的鍵或集合中的元素。
如果我們不確定變數儲存的物件類型,請使用 type()
函數。
my_dict = {'name': 'Jiyik'} print(type(my_dict)) # ????️ <class 'dict'> print(isinstance(my_dict, dict)) # ????️ True my_str = 'jiyik.com' print(type(my_str)) # ????️ <class 'str'> print(isinstance(my_str, str)) # ????️ True
type
函數傳回物件的型別。
如果傳入的物件是傳入類別的實例或子類,則 isinstance
函數傳回 True。
以上是Python中TypeError:unhashable type:'dict'錯誤如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。
