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.