1

这里发生了什么?

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

4

5 回答 5

3

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
>>>
于 2011-01-15T03:05:25.460 回答
3

原因很简单:没有定义。如果有人努力抓住空切片并委托给适当的方法,它没有理由不能工作。

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

于 2011-01-15T03:09:44.727 回答
3

a[:]是切片操作的一个特例,只为序列定义。它是 的缩写形式a[0:len(a)]。dict 不是序列。

于 2011-01-15T03:13:12.780 回答
1

如果此功能对您的系统至关重要,您可以将内置的 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)
于 2011-01-15T04:04:41.090 回答
0

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

于 2011-01-15T12:43:06.713 回答