In the last chapter, we mentioned that all objects are passed by reference and demonstrated passing an immutable object as a function argument. Here, we discuss references further by examining what happens when a program passes a mutable list object to a function.
Consider the function modify_elements
, which receives a reference to a list and multiplies each of the list’s element values by 2
:
In [1]: def modify_elements(items):
...: """"Multiplies all element values in items by 2."""
...: for i in range(len(items)):
...: items[i] *= 2
...:
In [2]: numbers = [10, 3, 7, 1, 9]
In [3]: modify_elements(numbers)
In [4]: numbers
Out[4]: [20, 6, 14, 2, 18]
Function modify_elements
’ items
parameter receives a reference to the original list, so the statement in the loop’s suite modifies each element in the original list object.
When you pass a tuple to a function, attempting to modify the tuple’s immutable elements results in a TypeError
:
In [5]: numbers_tuple = (10, 20, 30)
In [6]: numbers_tuple
Out[6]: (10, 20, 30)
In [7]: modify_elements(numbers_tuple)
-------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-27-9339741cd595> in <module>()
----> 1 modify_elements(numbers_tuple)
<ipython-input-25-27acb8f8f44c> in modify_elements(items)
2 """"Multiplies all element values in items by 2."""
3 for i in range(len(items)):
----> 4 items[i] *= 2
5
6
TypeError: 'tuple' object does not support item assignment
Recall that tuples may contain mutable objects, such as lists. Those objects still can be modified when a tuple is passed to a function.
The previous traceback shows the two snippets that led to the TypeError
. The first is snippet [7]
’s function call. The second is snippet [1]
’s function definition. Line numbers precede each snippet’s code. We’ve demonstrated mostly single-line snippets. When an exception occurs in such a snippet, it’s always preceded by ---->
1
, indicating that line 1 (the snippet’s only line) caused the exception. Multiline snippets like the definition of modify_elements
show consecutive line numbers starting at 1. The notation ---->
4
above indicates that the exception occurred in line 4 of modify_elements
. No matter how long the traceback is, the last line of code with ---->
caused the exception.
(True/False) You cannot modify a list’s contents when you pass it to a function.
Answer: False. When you pass a list (a mutable object) to a function, the function receives a reference to the original list object and can use that reference to modify the original list’s contents.
(True/False) Tuples can contain lists and other mutable objects. Those mutable objects can be modified when a tuple is passed to a function.
Answer: True.