python: changes to my copy variable affect the original variable
Question:
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:
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)
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[:]
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)
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)
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.
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)
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[:]
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)
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)