Python交换列表

Asw*_*esh 8 python list python-internals iterable-unpacking

在python中,当我将列表分配给另一个时,例如:

a = [1,2,3]
b = a
Run Code Online (Sandbox Code Playgroud)

现在b和指向同一个列表.现在考虑两个清单,

a = [1,2,3]
b = [4,5,6]
a,b = b,a
Run Code Online (Sandbox Code Playgroud)

现在它们如何像任何其他数据类型一样被交换,并且最终都没有指向同一个列表?

the*_*eye 7

看起来Python在内部交换项目.检查这个程序

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

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

import dis
dis.dis(func)
Run Code Online (Sandbox Code Playgroud)

产量

  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
Run Code Online (Sandbox Code Playgroud)

因此,Python推送来自和在堆栈中的引用.所以,现在最顶层的元素是指向的引用,下一个元素是指向的引用.然后它用于交换堆栈的前两个元素.所以,现在,最顶部的元件是由指向的参考和下一个被指向的参考,然后将堆叠的顶部的两个元素分配给和分别与.baLOAD_FASTabROT_TWObaabSTORE_FAST

当我们处理的项目数小于4时,这就是在赋值语句中进行排序的方式.

如果项目数大于或等于4,则构建一个元组并解压缩值.检查这个程序

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)
Run Code Online (Sandbox Code Playgroud)

产量

  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
Run Code Online (Sandbox Code Playgroud)