A dictionary view reflects the current contents of its backing mapping.
Python dictionary views: iteration sees a live mapping, not a snapshot
Operation contract
The audit status view is created before a second receipt is added. Reading the view afterward includes the new key; a copied tuple retains the earlier set of keys. A loop over a view should not change the dictionary size during iteration, because that can raise RuntimeError or produce an incomplete walk. The fixture collects a snapshot before deletion, then mutates the original mapping safely.
Failure and ownership boundary
A tuple of keys freezes the outer key sequence, not mutable objects inside values. Sorted order requires an explicit sort; dictionary insertion order is a separate property. Python dictionaries: insertion order and duplicate-key replacement, Python shallow and deep copies: preserve aliases deliberately and Python OrderedDict: explicit reordering differs from insertion order separate these claims.
Working program
ledger = {"R41": "queued"}
keys_view = ledger.keys()
keys_snapshot = tuple(keys_view)
ledger["R42"] = "sent"
print("live:", list(keys_view))
print("snapshot:", keys_snapshot)
for identifier in tuple(keys_view):
if ledger[identifier] == "queued":
del ledger[identifier]
print("remaining:", sorted(ledger))Output
live: ['R41', 'R42']
snapshot: ('R41',)
remaining: ['R42']Costs and limits
Creating a view is bounded work; materializing n keys into a tuple takes O(n) time and retained references. Deletion in the example is safe because the loop walks that tuple rather than a live dictionary iterator.
Common Mistakes
- A view is not a fixed list of keys.
- Do not resize a dictionary while iterating directly over its keys view.
Connected lessons
Python dictionaries: insertion order and duplicate-key replacement, Python shallow and deep copies: preserve aliases deliberately, Python OrderedDict: explicit reordering differs from insertion order.
