I’ve got a list that I create a copy of in order to do some manipulations while still keeping the original list. However, when I set copy_list equal to org_list, they become the same thing, and if I change copy_list, org_list changes too. For example:
org_list = ['y', 'c', 'gdp', 'cap']
copy_list = org_list
copy_list.append('hum')
print(copy_list)
print(org_list)
returns
['y', 'c', 'gdp', 'cap', 'hum'] ['y', 'c', 'gdp', 'cap', 'hum']
I don’t know too much about what is actually going on but it looks like org_list is actually passing itself to copy_list so that they are actually the same thing.
Is there a way to make an independent copy of org_list without doing something clumsy like:
copy_list = []
for i in org_list:
copy_list.append(i)
I say this because I have the same problem with other types of variables, for example a pandas dataframe.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
That is because in python setting a variable actually sets a reference to the variable. Almost every person learning python encounters this at some point. The solution is simply to copy the list:
copy_list = org_list[:]
Method 2
When you write
org_list = ['y', 'c', 'gdp', 'cap']
you create the list object, and give it the name “org_list”.
Then when you do
copy_list = org_list
you just mean, “the name copy_list refers to the same object as org_list does”.
If your list only contains immutable types, then you can create a copy by
copy_list = list(org_list)
But note that this is only valid if the list objects are immutable, because it creates a SHALLOW copy, i.e. the list is copied, but every element on the list is not duplicated.
If you have i.e. a list of lists and want EVERYTHING to be duplicated, you need to perform a DEEP copy:
import copy org_list = ['y', 'c', ['gdp', 'rtd'], 'cap'] copy_list = copy.deepcopy(org_list)
Method 3
This is just copying the reference
copy_list = org_list
you should use
copy_list = org_list[:] # make a slice that is the whole list
or
copy_list = list(org_list)
Method 4
Variable names in python are references to the original. To actually make a copy, you need to be explicit:
import copy copy_list = copy.copy(org_list)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0