为什么我不能在字典上调用del [:]?

时间:2011-01-15 02:58:17

标签: python dictionary datamodel

这里发生了什么?

>>> a = {1: "a", 2: "b"}
>>> del a[1]
>>> a
{2: 'b'}
>>> a = {1: "a", 2: "b"}
>>> del a[:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type
>>> a.clear()
>>> a
{}

为什么我必须拨打dict.clear

5 个答案:

答案 0 :(得分:3)

a[:]是制作list(和tuple)的浅表副本的快捷方式。请参阅docs的底部,了解不同类型的复制。

因此,它有理由说词典上的del a [:]并没有多大意义。

如果您想删除整个字典,只需执行del a

即可
>>> a = {1: "a", 2: "b"}
>>> del a
>>> a

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    a
NameError: name 'a' is not defined
>>>

答案 1 :(得分:3)

原因很简单:没有定义。如果有人把精力放在捕获空切片并委托给适当的方法,那么它就没有理由无法工作。

另一方面,这会违反对称原则,分配和获取相同的切片,因此可能无法获得接受。

答案 2 :(得分:3)

a[:]是切片操作的特例,仅为序列定义。它是a[0:len(a)]的简短形式。字典不是一个序列。

答案 3 :(得分:1)

如果此功能对您的系统至关重要,您可以继承dict builtin以添加此功能。

import sys
class newdict(dict):

    def __delslice__(self,i,j):
        if i==0 and j==sys.maxint:
            self.clear()
        else:
            dict.__delslice__(self,i,j)

答案 4 :(得分:0)

当您正在执行del a[1]时,您没有删除字典中的第一个元素,您将删除带有键1的元素。字典没有任何排序,因此切片算法(在这种情况下至少)。 这就是为什么使用词典a = {1 : 'one', 5 : 'five'}你可以做del a[1]而不能做del a[2]del a[0]