I will explain it in the following few lines of code.. name = "George" year = 2021 d = {"name": "Mike", "year": 1919} match d: case {"name": name, "year": 1917}: print("match 1 found”) # I want to remove binding "name" here from partial matching case {"year": year, "name": "Michael”}: print("match 2 found”) # I want to remove binding "year" here from partial matching. # Basically removing all name bindings after every partial/failed matching case _: print("match not found!”) print(f"{name = }, {year = }”) ### Output ###: match not found! name = 'Mike', year = 1919 But I want :var: 'name' to stay being the global name “George" and :var: 'year' being the global year 2021 if an exact matching is not found. Maybe it is done the way it is for speed optimization (overhead reduction or something), but what if I don't care about speed and I care about having no un-intentional side-effects? Can we do something like the following to solve this issue? match d, partial_binding=False: case … : ... case … : ... with partial_binding=True by default. Any other idea in how to prevent name binding due to partial matching from happening? Any previous discussions on this? Thanks, Abdulla