Python assignment, or shallow copy, doesn’t fully copy compound objects. Instead, it creates a new reference to the original. If you manipulate (mutate) the value of the new reference, the value of the original is changed, too. Deep copy makes an entirely new object, disconnected from its original. If you change the value of the deep copy, the value of the original remains unchanged.
import copy
a = [[4,5,6], [7,8,9]]
b = copy.copy(a)
print('a = ' + str(a))
print('b = ' + str(b))
a[0][0] = 1
print('a = ' + str(a))
print('b = ' + str(b))
#with a shallow copy, changing a[0][0] also changes b[0][0]
a = [[4, 5, 6], [7, 8, 9]]
b = [[4, 5, 6], [7, 8, 9]]
a = [[1, 5, 6], [7, 8, 9]]
b = [[1, 5, 6], [7, 8, 9]]
c = [[4,5,6], [7,8,9]]
d = copy.deepcopy(c)
print('c = ' + str(c))
print('d = ' + str(d))
c[0][0] = 1
print('c = ' + str(c))
print('d = ' + str(d))
#with a deep copy, changing c[0][0] does not change d[0][0]
c = [[4, 5, 6], [7, 8, 9]]
d = [[4, 5, 6], [7, 8, 9]]
c = [[1, 5, 6], [7, 8, 9]]
d = [[4, 5, 6], [7, 8, 9]]