这里发生了什么?
>>> 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
?
答案 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]