Skip to content Skip to sidebar Skip to footer

Copy List In Python

As I am trying to make a copy of a list and do some stuff with the copy of the list. Somehow my original list is modified as well. I already looked at different memory allocatinos

Solution 1:

Your original list contains inner lists:

[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], 
 ['BBB', 1, 1, 0, 26, 28, 0], ...
]

The inner list are actually stored as references, i.e.:

[ location-of-list-0, 
  location-of-list-1, ...
]

When you copied the list, you actually copied a list of references to the same lists stored in your original list. This is called shallow copy, as it copies references rather than contents.

Use deep copy to create a totally separate list.

Illustrations

Original List

enter image description here

Shallow copy

enter image description here

Deep copy

enter image description here

Solution 2:

Solution 3:

You should also copy inner lists, so deepcopy may help you.

Solution 4:

As [:] does only create a copy-slice of the list the slice is actually applied to, the reference to the objects stay the same. Using deepcopy does recursively copy every item that can be pointed out.

classFoo:def__init__(self):
        self.name   = "unknown"def__repr__(self):
        return"Foo: " + self.name

    def__copy__(self):
        f = Foo()
        f.name = self.name
        return f

    def__deepcopy__(self, d):
        returnself.__copy__()

lst = [Foo()]
lst[0].name = "My first foo"

lst2 = lst[:]
lst2.append(Foo())
lst2[1].name = "My second foo"

print lst
print lst2

output

[Foo: My first foo] [Foo: My first foo, Foo: My second foo]

lst2[0].name = "I changed the first foo"print lst
print lst2

output

[Foo: I changed the first foo] [Foo: I changed the first foo, Foo: My second foo]

from copyimport deepcopy
lst[0].name = "My first foo"
lst3 = deepcopy(lst)
lst3[0].name = "I changed the first foo again !"print lst
print lst3

output

[Foo: I changed the first foo] [Foo: I changed the first foo again !]

Lists, tuples, etc do support __copy__ and __deepcopy__ method.

Post a Comment for "Copy List In Python"