# Chapter 2: Mutability and References
print("IMMUTABLE OBJECT EXAMPLE (int):")
a = 5
b = a
print("Before change:")
print("a:", a, "id:", id(a))
print("b:", b, "id:", id(b))
# This creates a NEW integer object
a = a + 1
print("\nAfter change:")
print("a:", a, "id:", id(a))
print("b:", b, "id:", id(b))
# ------------------------------------
print("\nMUTABLE OBJECT EXAMPLE (list):")
list1 = [1, 2, 3]
list2 = list1 # Both reference the same object
print("Before modification:")
print("list1:", list1, "id:", id(list1))
print("list2:", list2, "id:", id(list2))
# This mutates the existing list object
list1.append(4)
print("\nAfter modification:")
print("list1:", list1, "id:", id(list1))
print("list2:", list2, "id:", id(list2))
# ------------------------------------
print("\nMAKING A REAL COPY:")
list3 = list1.copy() # Creates a new list object
list1.append(5)
print("list1:", list1, "id:", id(list1))
print("list3:", list3, "id:", id(list3))