先看一组代码: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)
ls = [2, 4, 6, 1, 56, 3, 12]
func2(ls)
print(ls)
是不是到这里就很疑惑,为什么交换顺序却导致结果不一样? 查询得到: 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)
不可变数据类型来说,交换元素位置对结果没有影响,但是对于可变数据类型来说却不一样,我们举个简单例子:
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,结果正确! 这也就解释了为什么上面的交换排序两个方法输出结果不一样的原因!
|