当前位置: 首页 > 科技观察

为什么a,b=b,a结果跟你想的不一样?

时间:2023-03-21 23:41:02 科技观察

我们知道在Python中要交换两个变量,用一行代码就可以实现:a,b=b,a例如:这个特性也是很多人介绍Python优于其他语言的case.但实际上,这种交换变量的方式,在某些特殊情况下,其行为可能与你想要的不一样。我们来看一个案例。在一些就地排序算法中,我们交换列表中两个索引对应的内容,例如:这似乎没有问题。进一步,如果兑换码写成:a=[0,2,1,3,5,6]a[a[1]+1],a[1]=a[1],a[a[1]+1]运行效果如下图所示:你肯定觉得很明显是真的,因为a[1]的值为2,a[1]+1的值为3,所以上面代码看起来等同于将列表中下标为1和下标为3的两个数字的顺序交换。即交换元素2和3的顺序。我们通常认为a,b=b,aandb,a=a,b这两种写法应该没有区别。两者都交换两个变量。但是对于上面的列表,如果我交换逗号左右两侧的数据,让我们看看:a=[0,2,1,3,5,6]a[1],a[a[1]+1]=a[a[1]+1],a[1]的运行结果如下:代码运行结果与修改前不同。之所以会出现这种情况,是因为这种交换两个值的方式虽然只有一行代码,但是Python在执行的时候,其实是分为两步的。对于a[1],a[a[1]+1]=a[a[1]+1],a[1],首先Python执行a[1]=a[a[1]+1],也就是说,a[1]=a[3]。这时候列表就变成了[0,3,1,3,5,6]。然后,Python再次执行a[a[1]+1]=a[1]。注意此时a[1]的值已经是3了。它变成了a[4]=a[1]。所以原来a[4]位置的5被a[1]位置的数字3覆盖了。所以最后的结果变成了[0,3,1,3,2,6]。因此,在使用Python这种一行交换两个变量的语法糖时,如果需要交换列表中的元素,请注意不要因为执行顺序导致结果与你想要的不一致.本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。