Python 3 removes name binding from outer scope

Chris Angelico rosuav at gmail.com
Tue Jul 25 03:28:47 EDT 2017


On Tue, Jul 25, 2017 at 4:47 PM, Rustom Mody <rustompmody at gmail.com> wrote:
> +1
> You can call it bug or bug-promoted-to-feature :D
>
> I call it surprising because I dont know of any other case in python where
> a delete is user-detectable
> ie python's delete of objects always works quietly behind the scenes whereas
> this adds a leakiness to the memory-management abstraction

You're conflating two things. There's nothing here that forces the
destruction of an object; the name is simply unbound. You can confirm
this from the disassembly in CPython:

>>> import dis
>>> def f():
...  try: 1/0
...  except Exception as e: pass
...
>>> dis.dis(f)
  2           0 SETUP_EXCEPT            12 (to 14)
              2 LOAD_CONST               1 (1)
              4 LOAD_CONST               2 (0)
              6 BINARY_TRUE_DIVIDE
              8 POP_TOP
             10 POP_BLOCK
             12 JUMP_FORWARD            34 (to 48)

  3     >>   14 DUP_TOP
             16 LOAD_GLOBAL              0 (Exception)
             18 COMPARE_OP              10 (exception match)
             20 POP_JUMP_IF_FALSE       46
             22 POP_TOP
             24 STORE_FAST               0 (e)
             26 POP_TOP
             28 SETUP_FINALLY            6 (to 36)
             30 POP_BLOCK
             32 POP_EXCEPT
             34 LOAD_CONST               0 (None)
        >>   36 LOAD_CONST               0 (None)
             38 STORE_FAST               0 (e)
             40 DELETE_FAST              0 (e)
             42 END_FINALLY
             44 JUMP_FORWARD             2 (to 48)
        >>   46 END_FINALLY
        >>   48 LOAD_CONST               0 (None)
             50 RETURN_VALUE
>>>

It actually does the equivalent of:

finally:
    e = None
    del e

In the normal case, this will leave the original exception loose and
garbage-collectable, but if it's been bound to another name, it won't.

ChrisA



More information about the Python-list mailing list