浅析python a,b=b,a

先看一组代码:python实现简单选择排序
基本思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,则经过n-1趟排序可以使得整个排序表有序。

实现代码1:

def func1(ls):
    for i, _ in enumerate(ls):
        ls[i], ls[ls.index(min(ls[i:]))] = ls[ls.index(min(ls[i:]))], ls[i]

实现代码2:

def func2(ls):
    for i, _ in enumerate(ls):
        ls[ls.index(min(ls[i:]))], ls[i] = ls[i], ls[ls.index(min(ls[i:]))]

代码似乎是一样的,只是交换的顺序变了而已,但是运行结果却不一样:

ls = [2, 4, 6, 1, 56, 3, 12]
func1(ls)
print(ls)
# [2, 4, 6, 1, 56, 3, 12]
ls = [2, 4, 6, 1, 56, 3, 12]
func2(ls)
print(ls)
# [1, 2, 3, 4, 6, 12, 56]

是不是到这里就很疑惑,为什么交换顺序却导致结果不一样?
查询得到:
a,b=b,a
右边的b,a会返回一个tuple,然后分别给a,b赋值tuple的第一个和第二个元素

a, b = 10, 20
c = b, a
print(c)
a, b = c
print(a, b)
# (20, 10)
# 20 10

不可变数据类型来说,交换元素位置对结果没有影响,但是对于可变数据类型来说却不一样,我们举个简单例子:

ls = [3, 4, 1, 5, 2]
c = ls[ls[1]], ls[1]
print("C:", c)
ls[1], ls[ls[1]] = c
print(ls[1], ls[ls[1]])
print(ls)

输出结果为:

C: (2, 4)
2 4
[3, 2, 4, 5, 2]

在ls[1], ls[ls[1]]=c的过程中,划重点:
首先赋值ls[1]=2,这时ls[1]已经改变了!所以ls[ls[1]]=4的时候修改的就是ls[2]了!
那么我们换一下交换顺序是否可以呢?

ls = [3, 4, 1, 5, 2]
c = ls[1], ls[ls[1]]
print("C:", c)
ls[ls[1]], ls[1] = c
print(ls[1], ls[ls[1]])
print(ls)

输出结果为:

C: (4, 2)
2 1
[3, 2, 1, 5, 4]

这样我们首先修改ls[ls[1]]就是ls[4]=4,然后再赋值ls[1]=2,结果正确!
这也就解释了为什么上面的交换排序两个方法输出结果不一样的原因!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值