Mutable Objects in Function Calls¶
Here, I showed the differences between mutable objects and immutable objects in terms of function call.
0. Example Setup¶
Example 0 Mutable Objects in function Call
Here, the mutable object is list.
1 2 3 4 5 6 | # Define a procedure, replace_spy, that takes as its input a list of three numbers,
# and modifies the value of the third element in the input list to be one more than its previous value
def replace_spy(p):
p[2] = p[2] + 1
|
1 2 3 4 | # test
spy = [0,0,7]
replace_spy (spy)
print spy
|
output:
>>> [0,0,8]
Example 1 Immutable Objects in function Call
1 2 3 4 | # Define a procedure, inc, that takes a number as input and increase that number by 1
def inc(n):
n = n + 1
|
1 2 3 4 | # test
a = 3
inc(a)
print a
|
output:
>>> 3
1. Comparison¶
# here is what happened in replace_spy (mutable object in function call)
before 'p[2] = p[2] + 1' statement after 'p[2] = p[2] + 1' statement
+---+---+---+ <---- spy +---+---+---+ <---- spy
| 0 | 0 | 7 | <---- p | 0 | 0 | 8 | <---- p
+---+---+---+ +---+---+---+
When we call a function, the name of the variable in the function now refers to the object that’s passed in.
So, now the value of P
of the parameter here refers to that object. Then after p[2] = p[2] + 1
statement,
since both p
and spy
refers to the same object, then modification in p
also modifies the value in spy
.
This only works when the object is mutable.
# here is what happended in inc (immutable object in function call)
before 'n = n + 1' statement after 'n = n + 1' statement
+---+ <---- a +---+ <--- a +---+ <---- n
| 3 | <---- n | 3 | | 4 |
+---+ +---+ +---+
Same as the mutable object, when we call a function, the name of the variable in the function now refers to the object
tha’s passed in. Son now the value of n
of the para here refers to that object. Since the number is immutable object,
now n
actually refers to a new object 4
. Essentially, this function does nothing, a
still be 3
.