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

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

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


a, b = b, a


例如:


1.png


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


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


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


2.png


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


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


运行效果如下图所示:


3.png


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


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


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


运行结果如下:


4.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 这种一行交换两个变量的语法糖的时候,如果需要对列表里面的元素进行交换,请一定要小心,不要由于执行顺序的问题导致结果跟想要的不一致。


请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
6月前
|
人工智能 图形学
PhysGen3D:清华等高校联合推出,单图秒变交互式3D场景
PhysGen3D是清华等高校联合开发的创新框架,通过单张图像重建3D场景并模拟物理行为,实现从静态图像到动态交互的突破性转换。
119 15
PhysGen3D:清华等高校联合推出,单图秒变交互式3D场景
|
11月前
|
人工智能 搜索推荐 API
用于企业AI搜索的Bocha Web Search API,给LLM提供联网搜索能力和长文本上下文
博查Web Search API是由博查提供的企业级互联网网页搜索API接口,允许开发者通过编程访问博查搜索引擎的搜索结果和相关信息,实现在应用程序或网站中集成搜索功能。该API支持近亿级网页内容搜索,适用于各类AI应用、RAG应用和AI Agent智能体的开发,解决数据安全、价格高昂和内容合规等问题。通过注册博查开发者账户、获取API KEY并调用API,开发者可以轻松集成搜索功能。
|
数据挖掘 索引 Python
Pandas中的crosstab:轻松构建交叉表
Pandas中的crosstab:轻松构建交叉表
338 0
|
消息中间件 Java Maven
|
设计模式 开发框架 前端开发
在DevExpress中使用BandedGridView表格实现多行表头的处理
在DevExpress中使用BandedGridView表格实现多行表头的处理
|
Ubuntu Linux
在Linux中,虚拟内存和交换空间作用是什么?
在Linux中,虚拟内存和交换空间作用是什么?
|
机器学习/深度学习 分布式计算 大数据
MaxCompute 2.0:开源系统的集成与创新
增强实时处理能力:进一步加强与Flink等实时处理框架的合作。 强化机器学习支持:提供更多内置的机器学习算法和工具。 增强数据治理功能:提供更完善的数据质量和安全治理方案。
|
编解码 人工智能 自然语言处理
七火山发布Etna文生视频模型
【2月更文挑战第17天】七火山发布Etna文生视频模型
1053 2
七火山发布Etna文生视频模型
|
存储 消息中间件 API
装R包(package)error:(as ‘lib’ is unspecified)installation of package had non-zero exit status]
装R包(package)error:(as ‘lib’ is unspecified)installation of package had non-zero exit status]