How To Make A Variable Immutable In Python
Solution 1:
Your understanding of "objects" in Python and variable assignments is flawed.
In a language like C, when you define a variable (say int a
), a tiny area of memory is allocated and reserved for this variable and a
is now something that refers to this area of memory. You can poke into this area, change it and find that a
"has a" different value now. A statement like a = 2
(or a = b
where b
is another variable) takes the value of the right hand side and writes it into the memory location reserved for a
. Now you can modify b
as you wish but a
will still retain the original value. This is why you can do things like a++
in C which means, "get the value of what a
refers to, add one to it and write it back to the same location".
In Python, when you say x = []
, a new list object is created and x
is made to "point" to that list. Now any change you make to x
is affecting this object. Suppose you say y = x
, you will get another reference to the same object. Changing y
(or x
for that matter)
will change the object which is now pointed to by x
and y
. This is what you've done with the B = A
assignment. All things done to this object via A
will be visible when you access it via B
since they both point to the same object. In this sense, all variables in Python are like pointers in C. You can also understand why we don't have a ++
operator in Python since it's meaningless to modify the contents of a memory location like in C.
The solution suggested by others so far is suggesting that you make a new object with the exact same contents as the list pointed to by A
and make B
point to this copy. This way, if you modify A
(or what A
points to), B
(or what B
points to) will remain unchanged.
This however doesn't make B
"immutable" (i.e. an object which cannot be modified in place). However, I think you have simply used the word erroneously and meant that you didn't want the aliasing to take place.
Solution 2:
When assigning objects in python, you assign references (something like pointers in C).
There are several ways to circumvent this but the IMHO most idiomatic is using copy:
importcopy
B = copy.copy(A)
In some cases you even may want to used deepcopy(), have a look at the documentation for details.
Solution 3:
The problem is:
B=A
now both point to the same object.
Try:
B = [i for i in A]
now B is a new list containing all the elements from A. Or simply:
B = A[:]
Solution 4:
Change the way you assign B
:
B = A
to
B = A[:]
Post a Comment for "How To Make A Variable Immutable In Python"