Variables In Python - Part 2

Posted on Sat 12 October 2019 in Python

This article is part2 of a series introducing Python variables through illustrative diagrams.

In part1 of the series, we looked at what variables are and how assignment works. In this post, we are going to see about mutable and immutable objects. and how variables work with them.

Mutable and Immutable objects?

An object whose value can be changed after the object is created is a Mutable object. list, dict, set are examples of mutable types.

On the contrary, an object whose values cannot be changed is called an Immutable object. int, float, string, tuples are immutable types. There does not exist any method on these types that could change the values of objects of these types.

Example: Mutable object

>>> my_list = [1, 2, 3, 4]
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
139974176509384
>>> 
>>> 
>>> my_list.append(5)
>>> my_list
[1, 2, 3, 4, 5]
>>> id(my_list)
139974176509384

In the code above, the list object [1, 2, 3, 4] is mutable. I used the append method on the list object to change the value of the object in place. The append method did not create a new list(id remains the same). However, it changed the value of the list object to [1, 2, 3, 4, 5]

Mutable_object_example.jpg

Example: Immutable object

>>> x = 100
>>> x
100
>>> id(x)
94499348082656
>>> y = x
>>> y
100
>>> id(y)
94499348082656
>>> 
>>> 
>>> x = 200
>>> x
200
>>> id(x)
94499348085856
>>> y
100
>>> id(y)
94499348082656

Let's take a look at the code above. I created an int object with value 100 and assigned 2 names to it x and y. We looked at the object referred by x and y and as expected, the object is the same (both value and id are the same). Next I did x = 200. This did not change the value of the int object with value 100(This is confirmed by examining y). Instead, a new object with value 200 was created and the name x was attached to it.

Immutable_object_example.jpg

Rebinding and Mutating

We are going to take a closer look at how variables work with mutable and immutable objects and understand the concepts of rebinding and mutating

Rebinding

>>> x = 100
>>> x = x + 10
>>> x
110

Here x refers to 100. Then x + 10 creates another int object 110 and x is rebound to it. x no longer refers to 100. Instead, x refers to 110. This is Rebinding x.

Let's take a look at another example:

>>> my_list = [1, 2, 3, 4]
>>> 
>>> my_list = my_list + [5]
>>> my_list
[1, 2, 3, 4, 5]

my_list refers to the list [1, 2, 3, 4]. my_list + [5] creates another list object [1, 2, 3, 4, 5, 6] and does not mutate the original list. Finally, the name my_list is rebound to the new list object. This is Rebinding my_list

Rebinding_a_mutable_object.jpg

Mutating

Mutating means we are changing the value of an object in place rather than creating a new object.

>>> names = ["Guido", "van"]
>>> id(names)
140413840651464
>>> names
['Guido', 'van']
>>> names.append("Rossum")
>>> names
['Guido', 'van', 'Rossum']
>>> id(names)
140413840651464

names refers to the list ["Guido", "van"]. Using append method, the list object is mutated in place. It does not create a new object. names still refers to the same list object (id remains the same)but with value changed to ['Guido', 'van', 'Rossum']

Rebinding and Mutating

>>> x = [1, 2, 3, 4, 5]
>>> x += [6]
>>> x
[1, 2, 3, 4, 5, 6]

This is an interesting case as both rebinding and mutating happens in x += [6]. Conceptually, x += [6] is x = x + [6] and it would be considered as rebinding only. However, under the hood, it is x = x.__iadd__(y). x.__iadd__(y) mutates x and then x = x.__iadd__(y) rebinds x to itself.

Rebinding_and_Mutating.jpg

Conclusion

This completes the two part series on Python variables. In this post, I explained the difference between mutating and rebinding with examples. I also illustrated how variables work with mutable and immutable objects. Understanding these basic concepts can help you in programming and reasoning Python better. To understand more, I recommend you to watch this video by Ned Batchelder given at PyCon.

That's it readers, until next time! Happy coding Python!