在python中,当我将列表分配给另一个时,例如:
a = [1,2,3]
b = a
现在b和指向同一个列表。现在考虑两个清单,
a = [1,2,3]
b = [4,5,6]
a,b = b,a
现在它们如何像任何其他数据类型一样被交换,并且最终都没有指向同一个列表?
答案 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
从堆栈中的b
和a
推送引用。所以,现在最顶层的元素是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
时,你就会失去对原始a
和b
的引用,重新分配。