How do I clone a list so that it doesn't change unexpectedly after assignment?
new_list = my_list
doesn't actually create a second list. The assignment just copies the reference to the list, not the actual list, so both new_list
and my_list
refer to the same list after the assignment.
To actually copy the list, you have several options:
You can use the builtin
list.copy()
method (available since Python 3.3):new_list = old_list.copy()
You can slice it:
new_list = old_list[:]
Alex Martelli's opinion (at least back in 2007) about this is, that it is a weird syntax and it does not make sense to use it ever. ;) (In his opinion, the next one is more readable).
You can use the built in
list()
constructor:new_list = list(old_list)
You can use generic
copy.copy()
:import copy
new_list = copy.copy(old_list)This is a little slower than
list()
because it has to find out the datatype ofold_list
first.If you need to copy the elements of the list as well, use generic
copy.deepcopy()
:import copy
new_list = copy.deepcopy(old_list)Obviously the slowest and most memory-needing method, but sometimes unavoidable. This operates recursively; it will handle any number of levels of nested lists (or other containers).
Example:
import copy
class Foo(object):
def __init__(self, val):
self.val = val
def __repr__(self):
return f'Foo({self.val!r})'
foo = Foo(1)
a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)
# edit orignal list and instance
a.append('baz')
foo.val = 5
print(f'original: {a}\nlist.copy(): {b}\nslice: {c}\nlist(): {d}\ncopy: {e}\ndeepcopy: {f}')
Result:
original: ['foo', Foo(5), 'baz']
list.copy(): ['foo', Foo(5)]
slice: ['foo', Foo(5)]
list(): ['foo', Foo(5)]
copy: ['foo', Foo(5)]
deepcopy: ['foo', Foo(1)]
Changes made in Python list showing up in copy of original list
Use copy.deepcopy
:
from copy import deepcopy
desc1 = deepcopy(desc)
list.copy
only makes a shallow copy: a new list
object, but its elements (here mutable sublists) will be references to the same objects as the elements of the original.
python: changes to my copy variable affect the original variable
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[:]
Changing one list unexpectedly changes another, too
Why does v change at all?
vec
and v
are both references.
When coding vec = v
you assign v
address to vec
.
Therefore changing data in v
will also "change" vec
.
If you want to have two different arrays use:
vec = list(v)
Looping over list to delete items - unexpected behavior
The assignment operator in python (as used in new_list = nums
) does not create a new object but just assigns another name to the existing object. Any changes you make to nums
will also affect new_list
.
To create a new object, you can make a shallow copy instead:
new_list = nums.copy()
Python copy list issue
The lst[:]
trick makes a copy of one level of list. You've got nested lists, so you may want to have a look at the services offered by the copy
standard module.
In particular:
first = foo(copy.deepcopy(mylst), "first")
Related Topics
Checking If Element Exists With Python Selenium
How to Terminate Process from Python Using Pid
How to Get Output from Subprocess.Popen(). Proc.Stdout.Readline() Blocks, No Data Prints Out
Converting Epoch Time With Milliseconds to Datetime
How to Filter Pandas Dataframe Using 'In' and 'Not In' Like in Sql
How to Force Division to Be Floating Point? Division Keeps Rounding Down to 0
How Does the @Property Decorator Work in Python
What's the Canonical Way to Check For Type in Python
Passing HTML to Template Using Flask/Jinja2
How to Post Json Data With Python Requests
What's the Easiest Way to Escape HTML in Python
How to Get Pid by Process Name
Cross-Platform Subprocess With Hidden Window
Integer Division by Negative Number
Pandas Conditional Creation of a Series/Dataframe Column
How to Read a Single Character from the User
What Does the Star and Doublestar Operator Mean in a Function Call
Difference Between Shallow Copy, Deepcopy and Normal Assignment Operation