msg in the except clause is in the same scope as msg on the first line.
But in Python 3 we have this new behavior too:
When an exception has been assigned using
as target, it is cleared at
the end of the except clause. This is as ifexcept E as N: foowas translated to
except E as N: try: foo finally: del NThis means the exception must be assigned to a different name to be
able to refer to it after the except clause. Exceptions are cleared
because with the traceback attached to them, they form a reference
cycle with the stack frame, keeping all locals in that frame alive
until the next garbage collection occurs.
so, you “overwrite msg” in the exception handler, and exiting the handler will delete the variable to clear the traceback reference cycle.