Предыстория: Вас часто спрашивают, в чем разница между глубоким и поверхностным копированием, я слышал это много раз, но до сих пор не знаю, в чем разница.
Поэтому эта статья является экспериментом, чтобы понять разницу между
Если есть список как a, то скопируйте в b
Мы можем обнаружить, что создается новый список и дается b. В этом примере кажется, что a и b независимы, хотя это не так, как мы увидим позже.
Мы хотим получить идентичный список, и мы также можем использовать оператор присваивания:
Резюме: мы видим, что оператор присваивания фактически получает тот же список, просто используйте переменные a и b для ссылки на него соответственно.
В дополнение к использованию метода построения, такого как list(), для выполнения поверхностного копирования, на самом деле результат конструктора и copy() одинаков, оба относятся к поверхностному копированию, мы можем посмотреть, результат точно такой же. такой же:
Мы не можем увидеть разницу между мелким копированием и глубоким копированием через приведенный выше тест, потому что наш список полон констант, поэтому мы не можем его увидеть, мы можем попробовать использовать вложенность списка для установки других структур данных, например, сначала взгляните на неглубокую копию:
Интерпретация: мы видим, что все объекты в неглубоком копировании являются общими. Мы изменяем значение b, что также повлияет на значение a, что в некоторых сценариях приведет к катастрофе. Хотя поверхностное копирование может сэкономить память, оно неразличимо. однозначно будут проблемы с разделением.Глубокая копия делает только одно,то есть переменная структура данных не разделяется,а неизменяемая структура все равно разделяется.В примере список как переменная структура будет копироваться отдельно.Копия отдается b, а константы и кортежи будут расшарены, потому что не будет такой беды, если все равно не измениться, давайте взглянем на глубокую копию:
Мы видим, что делается еще одна копия списка, так что он независим, даже если изменить один, это не повлияет на другой.
Примечание. Приведенная выше визуализация нарисована с помощью pythontutor, который очень прост в использовании и облегчает наше понимание памяти.