Почему я не могу позвонить дель [:] по требованию?

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?

Теги:
dictionary
datamodel

5 ответов

3
Лучший ответ

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

  • 0
    Можете ли вы сослаться на документацию, в которой указано, что [:] эквивалентно [0:len(a)] ?
  • 1
    docs.python.org/library/… note (4)
3

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

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

  • 0
    Можете ли вы дать ссылку на требуемые имена специальных методов, которые позволили бы это? (У меня нет намерения делать это, но было бы важно, почему этот вызов не удается).
  • 0
    Три метода в docs.python.org/reference/datamodel.html#object.__getitem__ .
Показать ещё 1 комментарий
3

a[:] - это быстрый способ сделать мелкую копию listtuple). См. В нижней части 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
>>>
  • 2
    Неправильно. del S[:] в последовательности удаляет все элементы, но не касается самого имени, в отличие от del S который только удаляет имя и не влияет на элементы.
  • 0
    @ IgnacioVazquez-Abrams: я не понимаю, почему это утверждение ведет себя так. Поскольку s [:] будет возвращать поверхностную копию списка, кажется логичным, что del s [:] просто удалит возвращенный объект, но это не сработает. Есть идеи почему? Это просто какая-то странная причуда языка?
Показать ещё 1 комментарий
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)
  • 0
    +1 за то, что разбил нарезку
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню