Swapping values of two variables

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Thu Jan 29 22:31:03 EST 2009


On Thu, 29 Jan 2009 17:50:04 -0800, tony.clarke5 wrote:

> On Jan 30, 12:29 am, Eric Kang <y... at sfu.ca> wrote:
>> In python, I set:
>>
>> x=1
>> y=3
>>
>> z = x
>> x = y
>> y = z
>>
>> This gave me 3 1, which are the values of x and y swapped. The
>> following would have given me the same result: x, y = y, x
>>
>> But could the swapping be done using less extra memory than this? What
>> is the minimum amount of extra memory required to exchange two 32-bit
>> quantities? What would be the pseudocode that achieves this minimum?
> 
> How about:
> def transpose(x, y):
>     print x, y, 'becomes: ',
>     x = x + y
>     y = x - y
>     x = x - y
>     print x, ' ', y
> 
> transpose(1,3)
> transpose (9,8)


I'm not sure what the point of that function is. It doesn't actually swap 
its arguments:

>>> x = 23
>>> y = 42
>>> transpose(x, y)
23 42 becomes:  42   23
>>> x
23
>>> y
42

And it certainly doesn't save memory, as the original poster asked:


>>> import dis
>>> swap = compile('x, y = y, x', '', 'single')
>>> dis.dis(swap)
  1           0 LOAD_NAME                0 (y)
              3 LOAD_NAME                1 (x)
              6 ROT_TWO
              7 STORE_NAME               1 (x)
             10 STORE_NAME               0 (y)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE


>>> dis.dis(transpose)
  2           0 LOAD_FAST                0 (x)
              3 PRINT_ITEM
              4 LOAD_FAST                1 (y)
              7 PRINT_ITEM
              8 LOAD_CONST               1 ('becomes: ')
             11 PRINT_ITEM

  3          12 LOAD_FAST                0 (x)
             15 LOAD_FAST                1 (y)
             18 BINARY_ADD
             19 STORE_FAST               0 (x)

  4          22 LOAD_FAST                0 (x)
             25 LOAD_FAST                1 (y)
             28 BINARY_SUBTRACT
             29 STORE_FAST               1 (y)

  5          32 LOAD_FAST                0 (x)
             35 LOAD_FAST                1 (y)
             38 BINARY_SUBTRACT
             39 STORE_FAST               0 (x)

  6          42 LOAD_FAST                0 (x)
             45 PRINT_ITEM
             46 LOAD_CONST               2 (' ')
             49 PRINT_ITEM
             50 LOAD_FAST                1 (y)
             53 PRINT_ITEM
             54 PRINT_NEWLINE
             55 LOAD_CONST               0 (None)
             58 RETURN_VALUE



The compiled code of the transpose function *alone* (not including all 
the other associated parts) takes 59 bytes, or 472 bits.

>>> len(transpose.func_code.co_code)
59

Even if it worked, that's hardly using less memory than a direct swap.



-- 
Steven



More information about the Python-list mailing list