moving items in a list

sismex01 at hebmex.com sismex01 at hebmex.com
Fri Jan 10 22:48:36 CET 2003


> From: andy [mailto:andy at eastonwest.co.uk]
> Sent: Friday, January 10, 2003 3:42 PM
> 
> And that was, er, about 20 years ago.  I've never seen a 
> language that could 
> do that any better without a 'swap' function.  
> 

BUT it's not a *true* swap... more to follow.

>
> a,b=b,a  # how much more obvious can you get?
>

Indeed. :-)
 
> Just goes to show that you need to talk to people about 
> Python - just applying what you already know from (even
> 20+ years of) programming experience IS NOT ENOUGH.  That
> would never have occurred to me...
> 
> -andyj
>

In this form ("a,b = b,a"), what actually happens behind
curtains is that, first, a tuple is created with (b,a),
and then, that same (temporary) tuple is unpacked into
(a,b).  It might take more time to do this operation,
than to do something like:

  _ = a
  a = b
  b = _

where "_" is some temporary variable.

Alas, there's no free lunch.  Although, it might be possible
that an optimizer might recognize cases such as these (pack-unpack)
and optimize it away into two sequential STORE_FASTs, because
the object references are already in the stack.

So, now, it does a LOAD_FAST (b), LOAD_FAST (a), CREATE_TUPLE,
UNPACK_SEQUENCE, STORE_FAST (a), STORE_FAST (b).  Where, it might
be able to skip the CREATE_TUPLE/UNPACK_SEQUENCE pair and simply
LOAD_FAST / LOAD_FAST / STORE_FAST / STORE_FAST, much better, no?

Anywho, that's life for ya. :-)

-gustavo





More information about the Python-list mailing list