Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python swapping lists

In python, when I assign a list to another, like:

a = [1,2,3]
b = a

Now b and a point to the same list. Now considering two lists,

a = [1,2,3]
b = [4,5,6]
a,b = b,a

Now how is it that they are swapped like any other data type and does not end up both pointing to the same list?

like image 984
Aswin Murugesh Avatar asked Dec 14 '13 11:12

Aswin Murugesh


People also ask

Is there any swap function in Python?

Q = int( input("Please enter value for Q: ")) # To swap the value of two variables. # we will user third variable which is a temporary variable.

How do you use the swap function in Python?

A simple swap function in Python is generally considered a function that takes two initialized variables, a = val_a and b = val_b , and returns a result of a = val_b and b = val_a . The function accepts variables of arbitrary types, or more precisely, variables that are assigned with objects of arbitrary types.

What is meant by swapping in Python?

Python: swapping two variables Swapping two variables refers to mutually exchanging the values of the variables. Generally, this is done with the data in memory. The simplest method to swap two variables is to use a third temporary variable : define swap(a, b) temp := a a := b b := temp.


2 Answers

Looks like Python internally swaps the items. Check this program

a, b = [1, 2], [2, 3]

def func():
    a, b = b, a

import dis
dis.dis(func)

Output

  4           0 LOAD_FAST                0 (b)
              3 LOAD_FAST                1 (a)
              6 ROT_TWO             
              7 STORE_FAST               1 (a)
             10 STORE_FAST               0 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE

So, Python pushes references from b and a in the stack with LOAD_FAST. So, now the top most element is the reference pointed by a and the next one is the reference pointed by b. Then it uses ROT_TWO to swap the top two elements of the stack. So, now, the top most element is the reference pointed by b and the next one is the reference pointed by a and then assigns the top two elements of the stack to a and b respectively with STORE_FAST.

That's how sorting is happening in the assignment statement, when the number of items we deal with is lesser than 4.

If the number of items is greater than or equal to four, it builds a tuple and unpacks the values. Check this program

a, b, c, d = [1, 2], [2, 3], [4, 5], [5, 6]

def func():
    a, b, c, d  = d, c, b, a

import dis
dis.dis(func)

Output

  4           0 LOAD_FAST                0 (d)
              3 LOAD_FAST                1 (c)
              6 LOAD_FAST                2 (b)
              9 LOAD_FAST                3 (a)
             12 BUILD_TUPLE              4
             15 UNPACK_SEQUENCE          4
             18 STORE_FAST               3 (a)
             21 STORE_FAST               2 (b)
             24 STORE_FAST               1 (c)
             27 STORE_FAST               0 (d)
             30 LOAD_CONST               0 (None)
             33 RETURN_VALUE
like image 127
thefourtheye Avatar answered Oct 01 '22 17:10

thefourtheye


Because Python assignment first evaluates the right-hand-side expression, then applies the result to the left-hand-side targets.

So, first, Python creates (<reference to list b>, <reference to list a>) as a tuple, then assigns the first item in that tuple to a, and the second item in that tuple to b. This swaps the references around neatly.

You could expand the assignment to read it like this:

tmp = b, a
a = tmp[0]
b = tmp[1]
like image 27
Martijn Pieters Avatar answered Oct 01 '22 15:10

Martijn Pieters