Python: изменения в моей переменной копирования влияют на исходную переменную
У меня есть список, в котором я создаю копию, чтобы делать некоторые манипуляции, сохраняя при этом исходный список. Однако, когда я устанавливаю copy_list
равным org_list
, они становятся одинаковыми, и если я изменяю copy_list
, изменяется и t21. Например:
org_list = ['y', 'c', 'gdp', 'cap']
copy_list = org_list
copy_list.append('hum')
print(copy_list)
print(org_list)
возвращает
['y', 'c', 'gdp', 'cap', 'hum']
['y', 'c', 'gdp', 'cap', 'hum']
Я не слишком много знаю о том, что происходит на самом деле, но похоже, что org_list
фактически передает себя на copy_list
, так что они на самом деле одно и то же.
Есть ли способ сделать независимую копию org_list, не делая что-то неуклюжие, например:
copy_list = []
for i in org_list:
copy_list.append(i)
Я говорю это, потому что у меня такая же проблема с другими типами переменных, например, с фреймворком pandas.
Ответы
Ответ 1
Это потому, что в настройке python переменная фактически устанавливает ссылку на переменную. Почти каждый человек, изучающий python, сталкивается с этим в какой-то момент. Решение состоит в том, чтобы просто скопировать список:
copy_list = org_list[:]
Ответ 2
Это просто копирование ссылки
copy_list = org_list
вы должны использовать
copy_list = org_list[:] # make a slice that is the whole list
или
copy_list = list(org_list)
Ответ 3
Когда вы пишете
org_list = ['y', 'c', 'gdp', 'cap']
вы создаете объект списка и указываете ему имя "org_list".
Затем, когда вы делаете
copy_list = org_list
вы просто имеете в виду, "имя copy_list относится к тому же объекту, что и org_list".
Если ваш список содержит только неизменяемые типы, вы можете создать копию
copy_list = list(org_list)
Но обратите внимание, что это допустимо только в том случае, если объекты списка неизменяемы, потому что он создает копию SHALLOW, т.е. список копируется, но каждый элемент в списке не дублируется.
Если у вас есть список списков и хотите, чтобы ВСЕ было дублировано, вам нужно выполнить DEEP-копию:
import copy
org_list = ['y', 'c', ['gdp', 'rtd'], 'cap']
copy_list = copy.deepcopy(org_list)
Я нахожусь на вашем уровне в изучении Python, и я (вроде) пишу блог, чтобы исправить понятия. Написание их помогает мне лучше понять. Это то, что я написал о мелкой копии и глубокой копии:
http://bioruffo.net/lpotf/bindings-shallow-copy-deep-copy/115/
Ответ 4
Переменные имена в python являются ссылками на оригинал. Чтобы сделать копию, вам необходимо явное:
import copy
copy_list = copy.copy(org_list)