Reference vs Value
Something very important to understand about lists is that they are not simply a single value. They are a collection of values. Each value in a list has a specific address (or index) in the computer's memory. Because of this, when we give lists to functions we might call, the computer does not copy all of the values in the list to a function. Rather, it just gives the function a reference to where those values exist in memory. This can cause some headaches for someone who might not be aware of what is going on. If the function changes the value in the list we gave it without our knowing, then we might be surprised when we try to use the list later on and find that it doesn't have the values we expected.
In the example below we can see the difference between working with values and working with references.
# WORKING WITH VALUES first = 0 second = 1 # swap temp = second second = first first = temp print first, second # >>> 1, 0 # Perfect! # WORKING WITH REFERENCES cheese = [1, 2, 3, 4, 5] spam = cheese cheese = 'hello' print cheese print spam # >>> [ 1, 2, 'hello', 4, 5] # >>> [ 1, 2, 'hello', 4, 5] # WHAT?!
If you were able to follow the above example, you might be wondering why spam
and cheese both changed when all we did was change
cheese to equal
'hello'. The reason is because when we set
spam = cheese we were not copying
all of the values from
cheese into a new list called
spam. We were simply
spam the location of the first item in
cheese. This is just like a
library. What if we were to create a bookshelf and put a bunch of books on it
and then create an index card with the name of
Fantasy and an address of 42.
We could then simply create a new index card called
Romance and give it the
Fantasy which is ... 42. This means that anyone who tries to find
Romance will be led directly to the superior genre of
Fantasy. They might be
happier with the selection of books but, unfortunately, they didn't find what
they were looking for.
You may be wondering how we can easily make copies of lists. Well, there is a
copy that you can import:
import copy. It has two methods
deepcopy() that you can use to copy your lists.
Take a look at the Python documentation on copy and deepcopy for more information about these methods.