Python 交换列表

标签 python list iterable-unpacking python-internals

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

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

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

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

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

最佳答案

看起来 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 将来自bareferences 推送到堆栈中,并带有LOAD_FAST。 .所以,现在最上面的元素是 a 指向的引用,下一个是 b 指向的引用。然后它使用 ROT_TWO交换栈顶的两个元素。所以,现在,最顶部的元素是 b 指向的引用,下一个是 a 指向的引用,然后将堆栈的顶部两个元素分配给 ab 分别为 STORE_FAST .

当我们处理的项目数少于 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)

输出

  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

关于Python 交换列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20582977/

相关文章:

python - 从Python中包含某些特定数字的列表中删除数字

c# - 将类型 T 的数组转换为类型 I 的数组,其中 T 在 C# 中实现 I

python - 为什么我的 numpy 构造忽略元组解构?

python - Pandas :转向真/假,删除列

python - 是否有接受距离矩阵和原始向量的Python Isomap 模块?

Python多进程运行多次

python - 在许多列表的列表中查找子列表的数量

c - 编译 linux 内核时无法识别 list_head

python - 当iterable包含数百万个元素时,是否有zip(* iterable)的替代方法?