这里发生了什么?
>>> 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
?
这里发生了什么?
>>> 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
?
a[:]
是制作list
(and tuple
) 的浅拷贝的快速方法。有关不同类型复制的说明,请参阅文档底部。
因此,有理由说字典上的 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
>>>
原因很简单:没有定义。如果有人努力抓住空切片并委托给适当的方法,它没有理由不能工作。
另一方面,这将违反分配和获得相同切片的对称原则,因此可能不会被接受。
a[:]
是切片操作的一个特例,只为序列定义。它是 的缩写形式a[0:len(a)]
。dict 不是序列。
如果此功能对您的系统至关重要,您可以将内置的 dict 子类化以添加此功能。
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)
当您这样做时,del a[1]
您不会删除字典中的第一个元素,而是删除键为 1 的元素。字典没有任何排序,因此没有切片算法(至少在这种情况下)。这就是为什么使用 dicta = {1 : 'one', 5 : 'five'}
你可以做del a[1]
和不能做del a[2]
或del a[0]