все 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Сообщить о неточности