只需一条语句“a,b=b,a”,就能直接交换两个变量

芒果YOLO11改进176:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响 芒果YOLO11改进186:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响 阅读详情

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,,版权归原作者所有,如有问题请及时联系我们以作处理

作者:Python猫     来源:腾讯云

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

 

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。

最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:

>>> x, y = 1, 2
>>> print(x, y)  # 结果:1 2

在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“=”号左侧的两个变量。

如果我们直接写x = 1,2 ,然后打印出 x,或者在“=”号右侧写成一个元组,就能证实到这一点:

>>> x = 1, 2
>>> print(x)     # 结果:(1, 2)
>>> x, y = (1, 2)
>>> print(x, y)  # 结果:1 2

一些博客或公众号文章在介绍到这个特性时,通常会顺着举一个例子,即基于两个变量,直接交换它们的值:

>>> x, y = 1, 2
>>> x, y = y, x
>>> print(x, y) # 结果:2 1

一般而言,交换两个变量的操作需要引入第三个变量。道理很简单,如果要交换两个杯子中所装的水,自然会需要第三个容器作为中转。

然而,Python 的写法并不需要借助中间变量,它的形式就跟前面的解包赋值一样。正因为这个形式相似,很多人就误以为 Python 的变量交换操作也是基于解包操作。

但是,事实是否如此呢?

我搜索了一番,发现有人试图回答过这个问题,但是他们的回答基本不够全面。(当然,有不少是错误的答案,还有更多人只是知其然,却从未想过要知其所以然)

先把本文的答案放出来吧:Python 的交换变量操作不完全基于解包操作,有时候是,有时候不是!

有没有觉得这个答案很神奇呢?是不是闻所未闻?!

到底怎么回事呢?先来看看标题中最简单的两个变量的情况,我们上dis 大杀器看看编译的字节码:
在这里插入图片描述
上图开了两个窗口,可以方便比较“a,b=b,a”与“a,b=1,2”的不同:

“a,b=b,a”操作:两个 LOAD_FAST 是从局部作用域中读取变量的引用,并存入栈中,接着是最关键的 ROT_TWO 操作,它会交换两个变量的引用值,然后两个 STORE_FAST 是将栈中的变量写入局部作用域中。
“a,b=1,2”操作:第一步 LOAD_CONST 把“=”号右侧的两个数字作为元组放到栈中,第二步 UNPACK_SEQUENCE 是序列解包,接着把解包结果写入局部作用域的变量上。
很明显,形式相似的两种写法实际上完成的操作并不相同。在交换变量的操作中,并没有装包和解包的步骤!

ROT_TWO 指令是 CPython 解释器实现的对于栈顶两个元素的快捷操作,改变它们指向的引用对象。

还有两个类似的指令是 ROT_THREE 和 ROT_FOUR,分别是快捷交换三和四个变量(摘自:ceval.c 文件,最新的 3.9 分支):
在这里插入图片描述
预定义的栈顶操作如下:

在这里插入图片描述
查看官方文档中对于这几个指令的解释,其中 ROT_FOUR 是 3.8 版本新加的:

ROT_TWO Swaps the two top-most stack items.

ROT_THREE Lifts second and third stack item one position up, moves top
down to position three.

ROT_FOUR Lifts second, third and forth stack items one position up,
moves top down to position four. New in version 3.8.

CPython 应该是以为这几种变量的交换操作很常见,因此才提供了专门的优化指令。就像 [-5,256] 这些小整数被预先放到了整数池里一样。

对于更多变量的交换操作,实际上则会用到前面说的解包操作:
在这里插入图片描述
截图中的 BUILD_TUPLE 指令会将给定数量的栈顶元素创建成元组,然后被 UNPACK_SEQUENCE 指令解包,再依次赋值。

值得一提的是,此处之所以比前面的“a,b=1,2”多出一个 build 操作,是因为每个变量的 LOAD_FAST 需要先单独入栈,无法直接被组合成 LOAD_CONST 入栈。也就是说,“=”号右侧有变量时,不会出现前文中的 LOAD_CONST 一个元组的情况。

最后还有一个值得一提的细节,那几个指令是跟栈中元素的数量有关,而不是跟赋值语句中实际交换的变量数有关。看一个例子就明白了:
在这里插入图片描述
分析至此,你应该明白前文中的结论是怎么回事了吧?

我们稍微总结一下:

  • Python 能在一条语句中实现多重赋值,这是利用了序列解包的特性
  • Python 能在一条语句中实现变量交换,不需引入中间变量,在变量数少于 4 个时(3.8 版本起是少于 5 个),CPython 是利用了 ROT_* 指令来交换栈中的元素,当变量数超出时,则是利用了序列解包的特性。
  • 序列解包是 Python 的一大特性,但是在本文的例子中,CPython 解释器在小小的操作中还提供了几个优化的指令,这绝对会超出大多数人的认知
tar解压报错 gzip: stdin: unexpected end of file tar: Unexpected EOF in archive 错误现象: [root@centos7-xinsz08 ~]# tar xf prometheus-2.7.2.linux-amd64.tar.gz gzip: stdin: unexpected end of file tar: 归档文件中异常的 EOF tar: 归档文件中异常的 EOF tar: Error is not recoverable: exiting now 错误原因排查 ... 阅读详情

相关推荐

使用ST-LINK烧录stm32教程说明

使用ST-LINK烧录stm32

qq_34426854的博客 1万+

【Python交换变量】Python中交换变量a,b=b,a是如何实现的?底层实现原理

Python中要想交换两个变量的值,不需要引入第三个变量,直接a,b=b,a就可以实现。 但是这里有一个问题:a和b的交换是同时进行的吗?看下面的例子: In [2]: l = [1, 2, 3, 4, 5] ...: i = 0 # 初始化i=0,这样l[i]=1, l[l[i]]=2 ...: l[i], l[l[i]] = l[l[i]], l[i] ...: print(l) [2, 2, 1, 4, 5] 在这个例子中,l[i]在前,于是它先被赋值,l[l[i]]在后,

weixin_38764427的博客 2202

用Python实现一个简单的远程桌面服务端和客户端

本文介绍了一个基于Python的轻量级远程桌面解决方案,针对商业软件在嵌入式系统上的兼容性问题、性能问题和成本问题。系统采用客户端-服务端架构,包含两个通信通道:5000端口传输压缩视频流,5001端口传输控制事件。通过多线程设计、图像压缩(JPEG+zlib)和网络优化(禁用Nagle算法)等技术手段提高性能。服务端实现了高效的屏幕捕获(使用mss库)、图像处理流水线和事件处理逻辑。客户端采用PyQt5构建UI界面,包含视频接收线程以减少主线程负担。该方案具有跨平台、开源免费、轻量级(核心代码不到500行

Hi20240217的博客 1655

a与b值交换

a=a^b; b=a^b; a=a^b;估计一下看不出来, 首先a=a^b; 所以 b=(a^b)^b=a^(b^b)=a^1=a, 然后a=a^b=(a^b)^a=(a^a)^b=1^b=b异或运算符,2进制运算符 0 ^ 1 得 1 1 ^ 1 得 0 0 ^ 0 得 0 1 ^ 0 得 1 1001001010101 ^1010111101001 ----------------

qq_21119289的博客 593

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

StarCCM+ 导入STL几何模型进行仿真

通过 Import Surface Mesh 的方法导入 STL 文件进行仿真

薛定谔的alpha狗 6128

python 字节码_32.12. dis — Python 字节码反汇编器 — Python 2.7.18 文档

32.12.1.Python字节码说明¶Python编译器当前生成以下字节码指令。STOP_CODE()¶Indicates end-of-code to the compiler, not used by the interpreter.NOP()¶什么都不做。 用作字节码优化器的占位符。POP_TOP()¶删除堆栈顶部(TOS)项。ROT_TWO()¶交换两个最顶层的堆栈项。ROT_THREE...

weixin_39825322的博客 225

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1330

python两个数值交换

python交换两个值得方法非常简单,即a,b=b,a,一步操作就交换了两个值,那么这是为什么呢? 原因: Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。 一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指 令(二进制指令),而是对应一段C代码,而不同的指令的性能...

qq_41386300的博客 3863

OpenClaw Skill 开发全攻略|2026 最新机制 + 文件处理实操,看完直接落地开发

很多新手刚接触时,会把 Skill 想得很复杂,其实大可不必。OpenClaw 中的每个 Skill,本质就是一套“能力描述 + 执行逻辑”的组合包,简单说就是“告诉 AI 你能做什么、怎么做,它就会调用你”,核心特征可以总结为这几点,好记又实用:核心载体:以文件夹为单位,不管多简单的 Skill,文件夹里都必须有 SKILL.md 文件——这是 AI 识别技能的唯一依据,少了它,再完善的代码也没用;

haolove527的专栏 7024

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

该系统的核心是基于STM32F103RCT6微控制器,这是一种高性能、低功耗的嵌入式处理器,适用于各种复杂的控制和数据处理任务。系统利用先进的传感器技术,如光电传感器PulseSensor模块来准确测量人体脉搏血氧饱和度及心率(PPG),同时采用AD8232生物电信号采集模块捕捉并处理人体的心电图信号(ECG),从而全面反映用户的心脏活动状态。

1万+

Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

Python是一款使用方便,易上手的工具,我们平常在工作中经常会用到,而且同时也是一款功能强大的编程语言,被广泛应用于数据分析、web开发、人工智能等行业。但是无论那个行业,哪个领域,想要熟练使用Python,就必须掌握Python的基础知识。 以下文章来源于:微信公众号Python猫 作者:豌豆花下猫 从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: &gt..

CDA数据分析师 411

华为OD技术面真题 - 数据库Redis - 1

汇总华为OD技术面真题Redis方面高频真题,提供详细解答。

qq_45776114的博客 932

python同步赋值语句 两个变量值的交换_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

点击上方“AI算法与图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达 从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2>>> print(x, y) # 结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组...

weixin_39834475的博客 852

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python中交换a和b的值_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2>>> print(x, y) # 结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“...

weixin_39793638的博客 1406

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python交换两个变量的值用eval_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

????“Python猫” ,一个值得加星标的公众号 从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>>x,y=1,2>>>print(x,y)#结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元...

weixin_33068783的博客 307

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

变量“componentresourcemanager”未声明或从未赋值_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

Python是一款使用方便,易上手的工具,我们平常在工作中经常会用到,而且同时也是一款功能强大的编程语言,被广泛应用于数据分析、web开发、人工智能等行业。但是无论那个行业,哪个领域,想要熟练使用Python,就必须掌握Python的基础知识。以下文章来源于:微信公众号Python猫作者: 豌豆花下猫从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常...

weixin_39716877的博客 690

python中交换的概念_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2>>> print(x, y) # 结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“...

weixin_39676972的博客 226

python两数交换 函数_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2>>> print(x, y) # 结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“=”号左侧的两个变量。如果我们直接写...

weixin_39908948的博客 278

python 变量只用一次_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2>>> print(x, y) # 结果:1 2在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“...

weixin_39673601的博客 120

python一个整数中交换其中数字位置_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>>x,y=1,2>>>print(x,y)#结果:12在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“...

weixin_33955307的博客 698

不实用额外变量 交换_Python 为什么只需一条语句“a,b=b,a”,就能够直接交换两个变量?...

从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>> x, y = 1, 2 >>> print(x, y) # 结果:1 2 在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值...

weixin_29723669的博客 116
上一篇: 爬虫案例:中国高校排名
下一篇: 爬取冰冰B站千条评论,看看大家说了什么
pythonputao
博客等级 码龄6年 60粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值