新的python学习者在这里,我遇到了一个问题,它说我的dict是不可用的。我在堆栈溢出时搜索了这个以获得其他答案,但我无法理解它们。有没有人对易于理解的不可听见的内容有解释?这也是我的代码中出现问题的部分
for name1, itemdescription1 in thisitem.items():
if rooms[currentroom-1][currentroom]["items"][name1][itemdescription1] == "yes": # if player already got this item
print ("You didn't find anything")
在上面代码的中间行上,它说TypeError:unhashable type:'dict' 这是我的代码
rooms = [
{1 : {
"name" : "hall",
"east" : 2,
"south" : 3,
"description" : "An empty hallway, nothing of use here. ",
"items" : {"torch" : {"a dim torch " : "no"}}
}},
{2 : {
"name" : "kitchen",
"west" : 1,
"east" : 4,
"south" : 6,
"description" : "An odd smell reeks from the kitchen. What could it be? ",
"items" : {"meat" : {"a piece of vile meat " : "no"}}
}},
{3 : {
"name" : "bedroom",
"north" : 1,
"east" : 6,
"description" : "A overwelmingly big room containing two gigantic beds, hmmm... ",
"items" : {"key" : {"a silver key " : "no"}}
}},
{4 : {
"name" : "diningroom",
"west" : 2,
"south" : 5,
"description" : "A large room with tables and chairs, nothing special. ",
"items" : {"plate" : {"a white plate " : "no"}}
}},
{5 : {
"name" : "bathroom",
"north" : 4,
"west" : 6,
"description" : "A creepy shadow lays in the bathtub, better go somewhere else. ",
"items" : {"shampoo" : {"a bottle of shampoo " : "no"}}
}},
{6 : {
"name" : "garage",
"north" : 2,
"west" : 3,
"east" : 5,
"description" : "It reeks of blood here. You wonder why. ",
"items" : {"bolts" : {"some rusted iron bolts " : "no"}}
}}
]
答案 0 :(得分:3)
任何未在其类定义中实现__hash__()
和__eq()__
魔术方法的对象都是不可删除的。
可散列对象是可以映射到唯一标识值的东西 - 想象一个可以获取对象并返回相应唯一编号的函数,并且您有正确的想法。它们是哈希表和字典的构建块,它的前提是键的这个唯一值(哈希)是指存储值的内存块 - 这样你就可以查找值一个关键非常非常快(实际上是恒定的时间)。
实际上,这种不可行性条件通常意味着可变对象 - 内容可以在内存中更改的对象,而不是通过返回新的修改对象 - 是不可用的。
列表和词典不可删除。元组,字符串和整数 - 所有不可变对象 - 都是可以清除的。
可以扩展列表和词典,使其可以清除。但是,只有少数利基用例可以证明使用可删除的词典和列表是合理的。在我看来,这不是其中之一。
Unhashable type
和不可用的对象A
时,通常会抛出 B
错误,并且您尝试使用B
作为键,即您调用{{1} }}。
您的错误来自于A[B]
,name1
或currentroom
中的一个是字典,并且您尝试在另一个字典中查找其中一个。
如果没有完整的代码,我们无法确定其中哪些是罪魁祸首,但您可以放心,错误来自那里。