Mutable & Immutable
Mutable
Changing the value of a mutable variable will not create a new object
list, byte array, sets, dict, class instances
- def changeMutable(v):
- v[2] = 100 # change 3rd element of v in main program
- v = [1, 2, 3, 4] # create a new object, not change v in main program
-
- l = list(range(10))
-
- changeMutable(l)
- print(l)# [0, 1, 100, 3, 4, 5, 6, 7, 8, 9]
-
Immutable
Changing the value of an immutable variable will create a new object with a different id
int, float, complex, str, tuples, bytes, frozensets
- def changeNum(n):
- n *= 10 # create a new object, not change n in main program
-
- # python create 10 in memory, all three variable points to the same memory
- n = 10;
- n2 = n;
- n3 = 10;
- print(id(n), id(n2), id(n3))
-
- changeNum(n)
- print(n) # 10
-
- # create a string
- s = 'Hello '
- print(id(s)) # 4422154032
- # create a new string object
- s = s+'World!'
- print(id(s)) # 4422194416
-
Assignment
- # create an object and assign the reference to l
- l = list(range(10))
-
- # assignment the reference of l to l2
- l2 = l
-
- # create a new object and assign the reference to l3
- l3 = list(range(10)) # mutable variable
-
- # l and l2 point to same object, l3 is a different object
- print(id(l), id(l2), id(l3))
-
- # create an immutable object
- i = (1, 2, 3, 4)
-
- # i and i2 point to same object
- i2 = i
-
- # create a new object
- i3 = (1, 2, 3, 4)
-
- print(id(i), id(i2), id(i3)) # i and i2 are same, and i3 have a different id
-
User defined class
- class Vehicle(object):
- """Document String: Define a Vehicle class"""
-
- def __init__(self, brand):
- self._brand = brand;
-
- def __str__(self):
- return self._brand
-
- def __hash__(self):
- return hash(self._brand)
-
- def __eq__(self, other):
- if isinstance(other, self.__class__):
- return self._brand == other._brand
- return NotImplemented
-
- # mutable object
- def change(v):
- print('Inside function ...')
- print(id(v)) # 4350403216
- v._brand = 'Lincoln'
-
- def main():
- v = Vehicle("Buick")
- print(id(v)) # 4350403216
- print(v) # Buick
-
- change(v)
- print('After call change function ...')
- print(id(v)) # 4350403216
- print(v) # Lincoln
-
- if __name__ == '__main__':
- main()
-
- # can be used as immutable object if __hash__ and __eq__ are defined
- # use as dictionary key
-
- def main():
- v = Vehicle("Buick")
- container = {v: 100} # use Vehicle instance as key
-
- print(container[Vehicle("Buick")])
-
- if __name__ == '__main__':
- main()
-
Resource