Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python不可破坏类型dict质疑为什么这两种方法有不同的结果_Python_Dictionary - Fatal编程技术网

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'}}}