В Python часто необходимо скопировать список. Для репликации естественно возникают проблемы с глубоким и поверхностным копированием. Разница между глубокой копией и поверхностной копией заключается в том, что когда новый список копируется из исходного списка, изменение любого из них повлияет на другой, то есть хранятся ли два списка в одной и той же области памяти. также является важной основой для различия между глубоким копированием и поверхностным копированием. Далее мы рассмотрим несколько методов копирования списка в Python, чтобы выяснить, является ли это глубокой копией или поверхностной копией. Выяснение этой проблемы поможет нам избежать ошибок в программировании и сократить ненужное время отладки.
Во-первых, метод без копирования — прямое присвоение
Если вы используете = для прямого назначения, это метод без копирования. Эти два списка эквивалентны, и изменения в одном из них повлияют на другой. В этом также заключается идеологическая разница между Python как динамическим языком и статическими языками, такими как C.
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 old = [1, [1, 2, 3], 3]
5 new = old
6 print('Before:')
7 print(old)
8 print(new)
9 new[0] = 3
10 new[1][0] = 3
11 print('After:')
12 print(old)
13 print(new)
результат операции:
Два, несколько методов мелкого копирования
1.copy()метод
Давайте посмотрим следующий код:
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 old = [1, [1, 2, 3], 3]
5 new = old.copy()
6 print('Before:')
7 print(old)
8 print(new)
9 new[0] = 3
10 new[1][0] = 3
11 print('After:')
12 print(old)
13 print(new)
результат операции:
Для первого слоя списка реализована глубокая копия, но для вложенного списка это все еще поверхностная копия. Это на самом деле очень легко понять.Внутренний список хранит адрес.При копировании прошлого адрес копируется. Вложенные списки по-прежнему указывают на один и тот же список в памяти.
2.Используйте понимание списка
Генерация нового списка с использованием понимания списка также является методом поверхностного копирования, который реализует глубокое копирование только для первого уровня.
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 old = [1, [1, 2, 3], 3]
5 new = [i for i in old]
6 print('Before:')
7 print(old)
8 print(new)
9 new[0] = 3
10 new[1][0] = 3
11 print('After:')
12 print(old)
13 print(new)
результат операции:
3.итерация с циклом for
Повторите цикл for, добавляя элементы один за другим в новый список. Это также метод поверхностного копирования, реализующий глубокое копирование только для первого слоя.
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 old = [1, [1, 2, 3], 3]
5 new = []
6 for i in range(len(old)):
7 new.append(old[i])
8 print('Before:')
9 print(old)
10 print(new)
11 new[0] = 3
12 new[1][0] = 3
13 print('After:')
14 print(old)
15 print(new)
результат операции:
4.Использовать фрагменты
Используя нарезку [:], вы можете копировать весь список. Точно так же реализуйте глубокую копию только для первого слоя.
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 old = [1, [1, 2, 3], 3]
5 new = old[:]
6 print('Before:')
7 print(old)
8 print(new)
9 new[0] = 3
10 new[1][0] = 3
11 print('After:')
12 print(old)
13 print(new)
результат операции:
3. Реализация глубокого копирования
Если используется метод deepcopy(), независимо от того, сколько слоев и в какой форме, новый полученный список не имеет отношения к оригиналу, это самый безопасный, самый свежий и самый эффективный метод.
При использовании для импорта копии.
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 import copy
5
6 old = [1, [1, 2, 3], 3]
7 new = copy.deepcopy(old)
8 print('Before:')
9 print(old)
10 print(new)
11 new[0] = 3
12 new[1][0] = 3
13 print('After:')
14 print(old)
15 print(new)
результат операции:
Выше говорилось о репликации списка и изучении глубокого и поверхностного копирования. Ввиду моего ограниченного уровня, в тексте есть неуместные моменты, просьба так же указывать в комментариях.