Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Метод Copy в Python
Copy — модуль Python, который предоставляет функции для создания копий объектов. Это критически важно при работе с данными в Data Science, особенно с pandas DataFrames и списками, так как Python работает с ссылками, а не с копиями значений.
Два типа копирования
В Python существует различие между поверхностным копированием (shallow copy) и глубоким копированием (deep copy).
1. Поверхностное копирование (Shallow Copy)
import copy
# Исходный список со вложенными структурами
original = [[1, 2, 3], [4, 5, 6]]
# Shallow copy
shallow = copy.copy(original)
# Изменяем элемент во вложенном списке
shallow[0][0] = 999
print(f"Original: {original}") # [[999, 2, 3], [4, 5, 6]]
print(f"Shallow: {shallow}") # [[999, 2, 3], [4, 5, 6]]
# Внешний список скопирован, но вложенные объекты указывают на те же адреса
print(f"Это один и тот же объект: {original[0] is shallow[0]}") # True
2. Глубокое копирование (Deep Copy)
import copy
original = [[1, 2, 3], [4, 5, 6]]
# Deep copy
deep = copy.deepcopy(original)
# Изменяем элемент во вложенном списке
deep[0][0] = 999
print(f"Original: {original}") # [[1, 2, 3], [4, 5, 6]]
print(f"Deep: {deep}") # [[999, 2, 3], [4, 5, 6]]
# Это разные объекты
print(f"Это разные объекты: {original[0] is deep[0]}") # False
Практические примеры в Data Science
1. Работа с Pandas DataFrames
import pandas as pd
import copy
# Создаём DataFrame
df_original = pd.DataFrame({A: [1, 2, 3], B: [4, 5, 6]})
# Неправильно: это просто ссылка
df_wrong = df_original
df_wrong.loc[0, A] = 999
print(df_original) # Изменилось!
# Правильно: поверхностная копия
df_shallow = df_original.copy()
df_shallow.loc[1, A] = 999
print(df_original) # Не изменилось
# Глубокая копия
df_deep = copy.deepcopy(df_original)
df_deep.loc[2, A] = 999
print(df_original) # Не изменилось
2. Копирование параметров моделей
import copy
from sklearn.ensemble import RandomForestClassifier
# Создаём две модели с одинаковыми параметрами
model1 = RandomForestClassifier(n_estimators=100, random_state=42)
model2 = copy.deepcopy(model1)
# Теперь модели независимы
model1.n_estimators = 50
print(model2.n_estimators) # Остаётся 100
3. Сохранение состояния конвейера обработки
import copy
# Состояние нормализации данных
original_params = {
mean: [1.0, 2.0, 3.0],
std: [0.5, 0.6, 0.7],
features: [A, B, C]
}
# Сохраняем копию для использования в тестировании
test_params = copy.deepcopy(original_params)
# Изменяем параметры для обучения
original_params[mean][0] = 99
print(f"Original: {original_params[mean]}")
print(f"Test: {test_params[mean]}") # [1.0, 2.0, 3.0]
Сравнение методов копирования
| Метод | Описание | Скорость | Использование |
|---|---|---|---|
= | Ссылка на объект | Мгновенно | Когда нужна общая ссылка |
.copy() | Shallow copy | Быстро | Dataframes, простые структуры |
copy.copy() | Shallow copy | Быстро | Общий случай |
copy.deepcopy() | Deep copy | Медленнее | Вложенные структуры |
Когда использовать deep copy
import copy
import time
# Создаём большой вложенный словарь
big_dict = {data: list(range(1000000)), nested: {value: 42}}
# Shallow copy быстрее
start = time.time()
shallow = copy.copy(big_dict)
print(f"Shallow: {time.time() - start:.6f}s")
# Deep copy медленнее, но безопаснее
start = time.time()
deep = copy.deepcopy(big_dict)
print(f"Deep: {time.time() - start:.6f}s")
Лучшие практики
- Используй
.copy()для pandas DataFrames - Используй
copy.deepcopy()для сложных вложенных структур - Избегай простого присваивания для изменяемых объектов
- Помни о производительности при работе с большими данными
Понимание copy критически важно для предотвращения трудноуловимых ошибок в data science коде.