Show that two names can point at the same list, and that rebinding one name leaves the other untouched.
In Python a variable is a name that is bound to an object. Assigning to a name creates or rebinds that binding, and it never copies the object. Two names that are bound to the same list are simply two labels on one single object.
first = [1, 2, 3]
second = first
second.append(4)
print(first) # [1, 2, 3, 4]
print(first is second) # True, one object and two names
third = first
third = [9] # this rebinds the NAME and creates a new list
print(first) # [1, 2, 3, 4], untouched
print(third) # [9]
print(first is third) # False
The two operations are worth naming separately, because they are different verbs in Python. Mutating an object, which means using append(), extend(), update() or item assignment, changes what every name bound to that object sees. Rebinding a name, which means a plain assignment, changes only that one name, and the object that it used to point at keeps existing for whoever else refers to it.
The third line is the one that trips people up. The names first, second and third all start out bound to one list, but the last assignment moves third onto a brand new list, and first and second carry on pointing at the original one.
This is also why you never need to write a manual copy. If you want an independent copy of a list, then slice it or call list() on it. If you want a copy of a nested structure, then you need copy.deepcopy, because a shallow copy still shares the inner objects.