Почему я не могу позвонить дель [:] по требованию? - PullRequest
1 голос
/ 15 января 2011

Что здесь происходит?

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

3 голосов
/ 15 января 2011

Причина довольно проста: она не определена.Нет причины, по которой это не могло бы работать, если бы кто-то приложил усилия для захвата пустого среза и делегирования подходящему методу.

С другой стороны, это нарушило бы принцип симметрии с назначением и получением того жесрез, так что, вероятно, не получит признание.

3 голосов
/ 15 января 2011

a[:] - это особый случай операции среза, который определяется только для последовательностей.Это краткая форма a[0:len(a)].Диктовка - это не последовательность.

3 голосов
/ 15 января 2011

a[:] - это быстрый способ сделать мелкую копию listtuple). См. В нижней части документы для разъяснения по различным типам копирования.

Таким образом, было бы разумно сказать, что 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 голос
/ 15 января 2011

Если эта функциональность важна для вашей системы, вы можете создать подкласс встроенного в dict для добавления этой функции.

0 голосов
/ 15 января 2011

Когда вы делаете del a[1], вы не удаляете первый элемент в словаре, вы удаляете элемент с ключом 1. Словарь не имеет никакого упорядочения и, таким образом, разрезает алгоритм (в данном случае, по крайней мере). Вот почему с помощью dict a = {1 : 'one', 5 : 'five'} вы можете делать del a[1], а не del a[2] или del a[0]

.
...