Python swapping lists

后端 未结 3 719
灰色年华
灰色年华 2021-01-11 22:44

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,

3条回答
  •  花落未央
    2021-01-11 23:32

    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
    

提交回复
热议问题