Python交换列表

时间:2013-12-14 11:57:47

标签: python list iterable-unpacking python-internals

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

看起来Python在内部交换项目。检查此程序

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

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

import dis
dis.dis(func)

<强>输出

  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

因此,Python使用LOAD_FAST从堆栈中的ba推送引用。所以,现在最顶层的元素是a指向的引用,下一个元素是b指向的引用。然后它使用ROT_TWO来交换堆栈的前两个元素。所以,现在,最顶层的元素是b指向的引用,下一个元素是a指向的引用,然后将堆栈的前两个元素分配给a和{ {1}}分别为STORE_FAST

当我们处理的项目数量少于4时,这就是赋值语句中的排序方式。

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

b

<强>输出

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)

答案 1 :(得分:3)

由于Python赋值 first 评估右侧表达式,然后将结果应用于左侧目标。

所以,首先,Python创建(<reference to list b>, <reference to list a>)作为元组,然后将该元组中的第一项指定给a,第二项该元组中的项目为b。这可以巧妙地交换参考文献。

您可以扩展作业,将其读取为:

tmp = b, a
a = tmp[0]
b = tmp[1]

答案 2 :(得分:0)

  

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

因为当你元组b, a 解包到元组a, b时,你就会失去对原始ab的引用,重新分配。