• Зачем в 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 комментарий