# Your dict isn't frozen.
# modifying a dict — add, update, merge, remove

soldier = {"name": "Raven", "score": 85}

# ─────────────────────────────────────────────
# Add and update — direct assignment
# ─────────────────────────────────────────────

soldier["rank"] = "Sergeant"    # new key
soldier["score"] = 91           # update existing
print(soldier)
# {'name': 'Raven', 'score': 91, 'rank': 'Sergeant'}

# ─────────────────────────────────────────────
# update() — merge another dict in
# ─────────────────────────────────────────────

soldier = {"name": "Raven", "score": 85}
new_data = {"rank": "Sergeant", "active": True}
soldier.update(new_data)
print(soldier)
# {'name': 'Raven', 'score': 85, 'rank': 'Sergeant', 'active': True}

# update() overwrites existing keys
soldier.update({"score": 99})
print(soldier["score"])         # 99

# update() with keyword arguments
soldier.update(score=75, active=False)
print(soldier["score"])         # 75
print(soldier["active"])        # False

# update() returns None — don't assign
soldier = {"name": "Raven"}
soldier = soldier.update({"score": 85})   # WRONG
print(soldier)                            # None

soldier = {"name": "Raven"}
soldier.update({"score": 85})             # CORRECT
print(soldier)                            # {'name': 'Raven', 'score': 85}

# ─────────────────────────────────────────────
# setdefault() — add only if missing
# ─────────────────────────────────────────────

soldier = {"name": "Raven", "score": 85}
soldier.setdefault("rank", "unassigned")  # key missing — added
soldier.setdefault("score", 0)            # key exists — not changed
print(soldier)
# {'name': 'Raven', 'score': 85, 'rank': 'unassigned'}

# ─────────────────────────────────────────────
# pop() — remove and return by key
# ─────────────────────────────────────────────

soldier = {"name": "Raven", "score": 85, "rank": "Sergeant"}
removed = soldier.pop("rank")
print(removed)      # Sergeant
print(soldier)      # {'name': 'Raven', 'score': 85}

# pop() with default — no KeyError if missing
soldier.pop("gear", None)       # returns None, no error
soldier.pop("gear", "unknown")  # returns "unknown", no error

# soldier.pop("gear")           # KeyError — no default provided

# ─────────────────────────────────────────────
# popitem() — remove last inserted pair
# ─────────────────────────────────────────────

soldier = {"name": "Raven", "score": 85, "rank": "Sergeant"}
last = soldier.popitem()
print(last)         # ('rank', 'Sergeant')
print(soldier)      # {'name': 'Raven', 'score': 85}

# ─────────────────────────────────────────────
# clear() — empty the dict
# ─────────────────────────────────────────────

soldier = {"name": "Raven", "score": 85}
soldier.clear()
print(soldier)      # {}   — dict still exists, just empty

# ─────────────────────────────────────────────
# Quick reference
# ─────────────────────────────────────────────

# d["key"] = value          — add or update key
# d.update(other)           — merge dict in (overwrites on conflict)
# d.update(key=value)       — update with keyword arguments
# d.setdefault("key", val)  — add key only if missing
# d.pop("key")              — remove and return value (KeyError if missing)
# d.pop("key", default)     — remove and return value (default if missing)
# d.popitem()               — remove and return last pair as tuple
# d.clear()                 — remove all keys
#
# all modify the dict in place
# pop() returns the removed value — everything else returns None
