python list by value not by reference

StackOverflow

Let"s take an example

a=["help", "copyright", "credits", "license"]
b=a
b.append("XYZ")
b
["help", "copyright", "credits", "license", "XYZ"]
a
["help", "copyright", "credits", "license", "XYZ"]

I wanted to append value in list "b" but the value of list "a" have also changed.
I think I have little idea why its like this (python passes lists by reference).
My question is "how can I pass it by value so that appending "b" does"t change values in "a" ?"

Answer rating: 247

You cannot pass anything by value in Python. If you want to make a copy of a, you can do so explicitly, as described in the official Python FAQ:

b = a[:]

Answer rating: 152

To copy a list you can use list(a) or a[:]. In both cases a new object is created.
These two methods, however, have limitations with collections of mutable objects as inner objects keep their references intact:

>>> a = [[1,2],[3],[4]]

>>> b = a[:]
>>> c = list(a)

>>> c[0].append(9)

>>> a
[[1, 2, 9], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>> b
[[1, 2, 9], [3], [4]]
>>> 

If you want a full copy of your objects you need copy.deepcopy

>>> from copy import deepcopy
>>> a = [[1,2],[3],[4]]

>>> b = a[:]
>>> c = deepcopy(a)

>>> c[0].append(9)

>>> a
[[1, 2], [3], [4]]
>>> b
[[1, 2], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>> 




Get Solution for free from DataCamp guru