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)