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