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

开发 后端
这个特性,也是很多人介绍Python比其它语言优越的一个案例。但实际上,这种交换变量的方式,在某些特殊情况下,它的行为可能跟你想要的不一样。我们来看一个案例。

[[410838]]

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

  1. a, b = b, a 

例如:

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

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

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

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

  1. a = [0, 2, 1, 3, 5, 6] 
  2. 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, a和 b, a = a, b这两种写法应该是没有什么区别的。都是交换两个变量。但是对于上面这个列表,如果我交换一下逗号左右两边的数据,我们再看:

  1. a = [0, 2, 1, 3, 5, 6] 
  2. 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」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

 

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2012-12-20 10:17:32

IT运维

2012-03-07 17:24:10

戴尔咨询

2011-09-02 10:12:36

网速测试结果网速测试网速测试方法

2021-01-11 14:02:22

dudf运维

2023-08-03 06:50:28

AMD苏姿2核心

2017-05-25 15:02:46

联宇益通SD-WAN

2015-10-19 12:33:01

华三/新IT

2016-05-09 18:40:26

VIP客户缉拿

2020-02-14 14:36:23

DevOps落地认知

2022-02-09 08:00:00

机器学习深度学习Keras

2023-03-20 08:19:23

GPT-4OpenAI

2012-07-18 02:05:02

函数语言编程语言

2018-05-09 15:42:24

新零售

2018-07-10 11:05:55

Emoji苹果Google

2009-12-01 16:42:27

Gentoo Linu

2009-02-04 15:43:45

敏捷开发PHPFleaPHP

2011-02-28 10:38:13

Windows 8

2009-06-12 15:26:02

2016-03-24 18:51:40

2010-11-24 20:18:48

Microsoft L统一沟通
点赞
收藏

51CTO技术栈公众号