Что здесь происходит?
>>> 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[:]
- частный случай операции разрезания, которая определяется только для последовательностей. Это короткая форма a[0:len(a)]
. Дик не является последовательностью.
Причина довольно проста: она не определена. Там нет причин, по которым он не мог работать, если кто-то попытался поймать пустой кусочек и делегировать соответствующий метод.
С другой стороны, это нарушит принцип симметрии с присвоением и получением одного и того же среза, поэтому, вероятно, не получит одобрения.
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
>>>
del S[:]
в последовательности удаляет все элементы, но не касается самого имени, в отличие от del S
который только удаляет имя и не влияет на элементы.
Если эта функция имеет решающее значение для вашей системы, вы можете подклассифицировать встроенный 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. Словарь не имеет никакого упорядочения и, таким образом, алгоритма сокращения (в данном случае, по крайней мере).
Вот почему с помощью dict a = {1 : 'one', 5 : 'five'}
вы можете сделать del a[1]
и не можете делать del a[2]
или del a[0]
[:]
эквивалентно[0:len(a)]
?