Names and mutation

is vs ==, two names for one list, and copies.

A name points at an object. Two names can point at the same list. == compares values. is compares identity.

Goal

Show aliasing on a list, then copy so a change does not leak.

Two names, one list

a = ["Nairobi", "Mombasa"]
b = a
b.append("Kisumu")
print("a", a)
print("b", b)
print("same object", a is b)

b = a does not copy. It sticks a second name on the same list.

Values vs identity

a = ["Nairobi"]
b = ["Nairobi"]
print("equal", a == b)
print("same", a is b)

Equal contents, two objects.

Copy

a = ["Nairobi", "Mombasa"]
b = list(a)
b.append("Kisumu")
print("a", a)
print("b", b)
print("same object", a is b)

list(a) is a shallow copy: a new list, same items inside. Enough when the items are strings.

Pitfall

c = a[:] also copies the list. c = a never does. Integers and strings are immutable, so aliasing them is usually harmless. Lists are not.