python dict是不可取的

时间:2016-04-29 04:18:02

标签: python dictionary

新的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"}} 
}}
]

1 个答案:

答案 0 :(得分:3)

回答问题陈述

任何未在其类定义中实现__hash__()__eq()__魔术方法的对象都是不可删除的。

可散列对象是可以映射到唯一标识值的东西 - 想象一个可以获取对象并返回相应唯一编号的函数,并且您有正确的想法。它们是哈希表和字典的构建块,它的前提是键的这个唯一值(哈希)是指存储值的内存块 - 这样你就可以查找值一个关键非常非常快(实际上是恒定的时间)。

实际上,这种不可行性条件通常意味着可变对象 - 内容可以在内存中更改的对象,而不是通过返回新的修改对象 - 是不可用的。

列表和词典不可删除。元组,字符串和整数 - 所有不可变对象 - 都是可以清除的。

可以扩展列表和词典,使其可以清除。但是,只有少数利基用例可以证明使用可删除的词典和列表是合理的。在我看来,这不是其中之一。

回答实际的基本问题

当您使用字典Unhashable type和不可用的对象A时,通常会抛出

B错误,并且您尝试使用B作为键,即您调用{{1} }}。

您的错误来自于A[B]name1currentroom中的一个是字典,并且您尝试在另一个字典中查找其中一个。

如果没有完整的代码,我们无法确定其中哪些是罪魁祸首,但您可以放心,错误来自那里。