Why is it important to know about the identity of compound object elements? Look at the following:
>>> L1 = [1, [2, 3], 4]
>>> L2 = L1[:]
>>> L2[1][0] = 5
>>> L2
[1, [5, 3], 4]
>>> L1
[1, [5, 3], 4]
This example modifies the first element of the list that is the
second element of L2. But the second element
of L1 is the same in memory as the second
element of L2. That is the reason why
L1 is also modified, whereas if we modify
the first level of L1, L2
remains unmodified because it only changes independent
references in the two lists.
>>> L1
[1, [5, 3], 4]
>>> L2
[1, [5, 3], 4]
>>> L1[1] = 6
>>> L1
[1, 6, 4]
>>> L2
[1, [5, 3], 4]
Figure 10.6 highlights in red the first
modification and in green the second one.
Copying references occurs also when you use variables.
>>> a = [1, 2]
>>> b = a
>>> a is b
True
>>> c = [a, 3]
>>> c
[[1, 2], 3]
>>> c[0] is a
True
>>> a[1] = 0
>>> c
[[1, 0], 3]
>>> a
[1, 0]
>>> b
[1, 0]
>>> c[0] = 0
>>> c
[0, 3]
>>> a
[1, 0]
Independent copies. It is possible to get an independent copy via the deepcopy function defined in the copy module.
>>> import copy
>>> L1
[1, 2, 4]
>>> L2
[1, [1, 3], 4]
>>> L3 = copy.deepcopy(L2)
>>> L3
[1, [1, 3], 4]
>>> L3[1] is L2[1]
False