• Что такое "Unhashable type"?

    @homeless_ra
    Объекты в Python бывают изменяемые, mutable, и неизменяемые, unmutable.

    Первые динамически работают с памятью, и их адрес может менятся, под вторые выделяется конкретный объем памяти и их адрес постоянен. Соответственно поэтому ключём или индексом может быть только второй тип обьектов, это кортежи, множества, строки, числа и отображения, такие объекты - hashable.

    В вашем случае keys_to_delete должен был быть кортежем.
    Ответ написан
    1 комментарий
  • Зачем в Python есть два способа создания копии списка?

    @Drozd000
    Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются?

    Как мне кажется, нашел правильный ответ на этот вопрос. Операции a[:] и a.copy() - это операции поверхностного копирования, т.е. такого копирования, при котором создается новый объект (список в данном случае) и в него записываются ссылки на все вложенные объекты.
    Операция = - это операция присваивания ссылки к объекту. Не копирование.

    При первой операции: a[1] = 0 - происходит присваивание ссылки к новому объекту 0. В списках b, c при этом остались ссылки на старый объект 2. Почему ссылка к новому объекту? Потому что тип int - неизменяемый, при всех операциях присваивания с неизменяемыми типами происходит присваивание ссылки к новому объекту, а не изменение старого.
    То есть:
    a = 5
    print(id(a)) # 4489501472
    a = 2
    print(id(a)) # 4489501376 - объект-то новый

    При второй операции a[2][1] = 'xx' изменяется объект a[2] (а это список, изменяемый, поэтому ссылка на объект не изменилась, а изменился сам список). При копировании была скопирована ссылка на этот список a[2]. Список изменился, но ссылка осталась та же во всех переменных a, b, c.

    P.S. лучше поздно, чем никогда :))
    Ответ написан
    1 комментарий
  • Зачем в Python есть два способа создания копии списка?

    aRegius
    @aRegius
    Python Enthusiast
    Приветствую, weranda.

    ...Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются?...

    Потому что [:], copy(), list() создают т.н. "поверхностные" копии. Используйте copy.deepcopy() для решения подобной проблемы:
    >>> a = [1 , 2, [3, 4]]
    >>> import copy
    >>> b = copy.deepcopy(a)
    >>> a[2][1] = 156
    >>> a
    [1, 2, [3, 156]]
    >>> b
    [1, 2, [3, 4]]
    Ответ написан
    Комментировать