Python Glossary English

все Python 3copyпонятие

Ловушки копирования

ловушки

Типичные ошибки: mutable default arguments, циклические ссылки, shared state при shallow copy.

Синтаксис

# Используй copy/deepcopy для безопасного копирования мутируемых объектов

Главная развилка: срез lst[:], dict.copy() и copy.copy() копируют только верхний уровень — вложенные списки и словари остаются общими, так что правка внутри копии видна в оригинале. copy.deepcopy() спускается вглубь и не зацикливается на циклических ссылках (он помнит уже скопированные объекты в memo), но платит за это скоростью и памятью, поэтому в горячем цикле от него лучше отказаться. Отдельная ловушка — значение по умолчанию def f(lst=[]): оно вычисляется один раз при определении функции, а не при каждом вызове; лечится через None и создание списка внутри тела.

Примеры

import copy
# Mutable default — антипаттерн:
def bad(lst=[]):
    lst.append(1); return lst
bad(); bad() # → [1, 1]  один объект!
import copy
# Циклическая ссылка:
a = []
a.append(a)
b = copy.deepcopy(a)  # deepcopy справляется
b is a # → False
import copy
# Shallow: одинаковые вложенные объекты
x = [[0]*3]*3
y = copy.copy(x)
y[0][0] = 9
print(x) # → [[9,0,0],[9,0,0],[9,0,0]]

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности