Python不可破坏类型dict质疑为什么这两种方法有不同的结果
我绊倒了阿克罗斯,想知道为什么我不能这样做:Python不可破坏类型dict质疑为什么这两种方法有不同的结果,python,dictionary,Python,Dictionary,我绊倒了阿克罗斯,想知道为什么我不能这样做: # this does not work pipeline = { {"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}} } pipeline 正如它所给出的: --------------------------------------------------------------------------- TypeErr
# this does not work
pipeline = {
{"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}}
}
pipeline
正如它所给出的:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-7305ba79e664> in <module>
1 pipeline = {
----> 2 {"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}}
3 }
4 pipeline
TypeError: unhashable type: 'dict'
其中:
{'resample': {'type': 'trans', 'name': 'resample', 'kwargs': {'rule': '1min'}}}
我只是比任何事情都好奇,因为就最终结果而言,我感觉自己在做同样的事情,但不确定第一种方法失败的原因,但第二种方法是可以的 因为不能将字典项保留在集合中。当你试图申报时
pipeline = {
{"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}}
}
您基本上是在尝试创建一个集合,该集合的第一项是字典,它是:
{"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}}
但是,您始终可以将管道单独分配给此字典。集合要求项可以散列。词典本身在python中是不可散列的。你可以用任何字典在终端上试试这个。尝试
hash({1:a',2:b'})
它会给你同样的TypeError:unhabable type:'dict'
错误。虽然我想你可能只是想少用一对大括号,但我想我应该解释一下为什么你会得到这样的输出。通过理解Python如何实现字典(以及使用字典实现的集合),可以更好地理解错误
字典是一个关联数组。当您写入mydict['foo']=bar
Python将字符串'foo'
散列为一个数值,并使用该值决定在哪个内存位置放置bar
。当您想稍后访问'foo'
的值时,Python再次散列'foo'
,生成数值并查找该值对应的内存位置
让我们假设您在错误行中通过赋值定义了字典而不是集合。你会有这样的东西:
keydict = {'foo': bar}
mydict[keydict] = baz
现在,Python必须以某种方式使用字典{'foo':bar}
生成一个数值,该数值将映射到存储baz
的内存位置。即使你能想出一种方法将字典转换成数值,问题是字典是可变的。如果要将一个元素添加到keydict
中,然后使用您的方法将其转换为一个数值,则该数值将与以前不同。因此,您将不再知道在哪里可以找到baz
出现
不可损坏类型
错误,因为字典是可变的,因此它们的数值散列值可能会更改。在第一行中,当您将字典放在一个集合中时,Python会尝试对它进行散列,以决定它应该存储在哪个内存位置。当注意到它是一个可变类型时,就会抛出错误 字典的构造应该是键:值对,因此在您的例子中,“重采样”是键,合适的字典是它的值。您刚刚尝试分配一个由{“重采样”:{…}组成的字典,但没有任何键
如果您尝试此操作,它将按预期工作:
pipeline = {
"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}
}
print(pipeline)
#{'resample': {'type': 'trans', 'name': 'resample', 'kwargs': {'rule': '1min'}}}
pipeline={…}
是一个集合。这两件事是不同的。注意与第二个输出相比,内容周围额外的{}
。这就像试图在管道的输出上编写{pipeline}
。
pipeline = {
"resample" : {"type" : "trans", "name" : "resample", "kwargs" : {"rule" : "1min"}}
}
print(pipeline)
#{'resample': {'type': 'trans', 'name': 'resample', 'kwargs': {'rule': '1min'}}}