View и copy: предсказание влияния изменений среза на исходный массив
Содержание курса
Проверка общей памяти через np.shares_memory
Понять концептуально, что view разделяет память с оригиналом, — хорошо. Но когда нужно убедиться в этом программно, есть конкретный инструмент: np.shares_memory(a, b).
Функция возвращает True, если массивы a и b делят хотя бы один общий байт памяти. Если их данные полностью независимы — вернёт False. Никакого анализа значений, никаких сравнений элементов — только проверка адресов.
import numpy as np
a = np.array([10, 20, 30, 40, 50])
# Срез — view: данные общие
v = a[1:4]
print(np.shares_memory(a, v)) # True
Теперь создадим копию через .copy() и проверим то же самое:
c = a[1:4].copy()
print(np.shares_memory(a, c)) # False
.copy() запрашивает у NumPy новый кусок памяти и копирует туда значения. После этого c — полностью самостоятельный объект. Связи с a на уровне байтов нет, и np.shares_memory это честно подтверждает.
Важный момент: .copy() можно вызывать как на срезе, так и на целом массиве. Оба варианта дают одинаковый результат — независимое хранилище:
full_copy = a.copy()
print(np.shares_memory(a, full_copy)) # False
np.shares_memory стоит использовать как основной инструмент всякий раз, когда есть сомнение: «это view или копия?». Сравнение значений здесь не поможет — при создании view и copy содержат одинаковые числа, разница только в том, где они хранятся.
