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

举报
未闻Code 发表于 2022/02/16 20:51:49 2022/02/16
【摘要】 用一行代码在Python里面交换两个变量的结果可能和你想的不一样

我们知道,在Python里面要交换两个变量,可以用一行代码实现:

a, b = b, a

例如:

2.png

这个特性,也是很多人介绍Python比其它语言优越的一个案例。

但实际上,这种交换变量的方式,在某些特殊情况下,它的行为可能跟你想要的不一样。我们来看一个案例。

在一些in-place排序算法中,我们会交换一个列表中两个索引对应的内容,例如:

3.png

这看起来没有什么问题。更进一步,如果交换的代码写为:

a = [0, 2, 1, 3, 5, 6]
a[a[1] + 1], a[1] = a[1], a[a[1] + 1]

运行效果如下图所示:

4.png

你肯定觉得显然是成立的,因为 a[1] 的值是2,a[1] + 1 的值是3,所以上面这段代码看起来相当于把列表下标为1和下标为3的两个数字交换顺序。也就是把元素2和元素3交换顺序。

我们平时一般觉得:a, b = b, a 和  b, a = a, b 这两种写法应该是没有什么区别的。都是交换两个变量。但是对于上面这个列表,如果我交换一下逗号左右两边的数据,我们再看:

a = [0, 2, 1, 3, 5, 6]
a[1], a[a[1] + 1] = a[a[1] + 1], a[1]

运行结果如下:

5.png

代码运行结果跟修改之前竟然不一样。

之所以会出现这种情况,是因为这种交换两个值的方式,虽然只有一行代码,但是 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 这种一行交换两个变量的语法糖的时候,如果需要对列表里面的元素进行交换,请一定要小心,不要由于执行顺序的问题导致结果跟想要的不一致。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。