How is the execution order of 'x = z'? (also: Python FAQ 4.88)

Bjorn Pettersen BPettersen at NAREX.com
Tue Jul 22 16:28:15 EDT 2003


> From: Ames Andreas (MPA/DF) [mailto:Andreas.Ames at tenovis.com] 
> 
> Hello,
> 
> during execution of an assignment statement like
>
> x = y
> .
> .
> .
> x = z # <--
> 
> is y's reference count decremented (and therefore its __del__ possibly
> called) *before* x is bound to z (or is z bound to x, I don't know the
> correct wording) or *afterwards*?

I'm not sure exactly what you're asking, but "x = y", is similar to the
following C-pseudo-code:

 1 incref(*y);
 2 tmp = x
 3 x = y;
 4 decref(*tmp); // potentially calling __del__

[[if I'm reading ceval.c correctly... lines 2-4 being in SETLOCAL,
called from STORE_FAST, based on the following code:

>>> def f(a,b):
...    a = b
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_FAST                1 (b)
              3 STORE_FAST               0 (a)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE
]]

whether this should matter to you is dubious since the case you seem to
be worried about (y being deleted before z assigned to x) would only
matter if it caused z to have a dangling reference to y. However, if z
has a reference to y, its reference count can't go to zero, thus no
__del__ would ever be called.

-- bjorn





More information about the Python-list mailing list