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"