python: changes to my copy variable affect the original variable

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

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x