Почему мне нужно .copy() массив numpy (или список, хотя у них нет .copy(), но это хороший минимальный пример), когда я хочу получить его независимую копию, в то время как мне не нужно делать это с переменная? В чем причина такого поведения?
Например. установка a = 1 и b = a, а затем установка b = 2 не меняет a, тогда как a=([0]), b = a и b[0]=1 также изменяет a.
Изменить:
Похоже, что это очень распространенная проблема/вопрос, который можно задать по-разному, поэтому я не смог его найти. Для быстрого "Мне просто нужно понять, что происходит, чтобы двигаться дальше" я думаю, что ответ (и ответы на другие такие же/похожие вопросы) достаточно хорош. Для лучшего понимания я думаю, что эта ссылка, предоставленная @chthonicdaemon в комментариях, кажется хорошим началом точка для меня.
длинный фон
Во многих ситуациях мне приходится создавать массив numpy с некоторыми начальными значениями, который затем заполняется другими значениями во время работы моей программы. т.е.
logger = np.zeros(5)
#various things happen
logger[0] = 1
#more stuff happens
logger[3] = 1
вы поняли идею.
Но часто желательно сохранить базовый массив, чтобы иметь возможность сравнивать с ним результаты, поэтому я просто сначала настраиваю базу, а потом делаю из нее копии. Поэтому я ожидаю, что я просто мог бы настроить это так:
base = np.zeros(5)
logger = base
logger[0] = 1
чтобы
In [1]:base
Out[1]:array([ 0., 0., 0., 0., 0.])
In [2]:logger
Out[2]:array([ 1., 0., 0., 0., 0.])
Однако с приведенным выше массивом они остаются «подключенными», так что я получаю
In [1]:base
Out[1]:array([ 1., 0., 0., 0., 0.])
Я могу исправить это, явно используя
logger = base.copy()
но мне интересно, почему я должен.
logger = fooсовершенно отличается от изменения объекта с помощью чего-то вродеlogger[0] = 1. - person Aran-Fey   schedule 03.05.2018loggerиbaseссылаются на один и тот же объект. - person hpaulj   schedule 03.05.2018=имеет разные значения, в зависимости от того, к чему я его применяю. - person JC_CL   schedule 03.05.2018foo = barиfoo[0] = bar. Этот вопрос спрашивает, почему две разные операции делают две разные вещи, а не почему присваивание не создает копию. - person Aran-Fey   schedule 03.05.2018list, но это тот же принцип. А более короткую статью с милыми диаграммами, в которой обсуждается то же самое, что и в статье Неда Батчелдера, но под немного другим углом, см. В других языках есть переменные, в Python есть имена - person PM 2Ring   schedule 03.05.2018