- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
本指南基于 swap-variables.md 一文,系统讲解 Python 中交换两个变量值的三种方法:临时变量法、元组打包/解包法(无需临时变量)与算术运算法(仅限数字)。读完本文,你将掌握每种方法的完整写法、底层原理与适用场景,并能根据数据类型的差异在真实项目中做出正确选择。三种方法均属于该仓库 Python 系列(Python 集合,面向 Python 3.6)的基础变量操作技巧,可直接用于日常编码。
方法一:使用临时变量(temp variable)
这是最直观、也是最经典的交换方式:借助第三个变量temp暂存其中一个变量的值,再依次完成赋值。
其核心思路分三步:
- 先把
a的值暂存到temp(temp = a); - 再把
b的值赋给a(a = b); - 最后把暂存在
temp中的原值赋给b(b = temp)。
a = 11 b = 7 temp = a a = b b = temp print(a) # 7 print(b) # 11执行过程拆解:
| 语句 | a 的值 | b 的值 | temp 的值 |
|---|---|---|---|
| 初始化 | 11 | 7 | — |
temp = a | 11 | 7 | 11 |
a = b | 7 | 7 | 11 |
b = temp | 7 | 11 | 11 |
适用性与局限:该方法对任意数据类型(数字、字符串、列表、字典、自定义对象等)都成立,是三类方法中通用性最强的一种。缺点是需要额外开辟一个临时变量,略显冗长。
方法二:无需临时变量——元组打包与序列解包(Tuple swap)
Python 提供了一种语法层面的优雅解法:直接写a, b = b, a,完全不需要第三个变量。
这背后的机制由两个语言特性支撑:
- 元组打包(tuple packing):用逗号分隔多个值即可构造元组,例如
b, a在求值后会打包成元组(b, a); - 序列解包(sequence unpacking):将逗号分隔的目标变量放在赋值语句左侧,会按顺序把右侧序列中的元素依次解包到这些变量中,例如
a, b = ...会把右侧第一个值赋给a、第二个值赋给b; - 关键求值顺序:Python 会先求值赋值语句的右侧(RHS),再执行左侧(LHS)赋值。因此右侧先把
(b, a)快照成元组,左侧再依序解包,完成交换。
a = 11 b = 7 a, b = b, a print(a) # 7 print(b) # 11可扩展到多个变量:这一特性决定了该写法天然支持超过两个变量的交换与排列——只要左右两侧的变量数量一致即可。例如三个变量的一次轮转:
a, b, c = 1, 2, 3 a, b, c = c, a, b print(a) # 3 print(b) # 1 print(c) # 2甚至无需中间元组变量,就能完成一次整体轮转。这正是 Python 相比多数语言在“置换(permutation)”场景下更简洁的原因。
补充说明:元组与列表在可变性、内存占用上的差异可参考仓库中的 lists-tuples.md;而如果需要在交换的同时保留字段名语义,可进一步了解 named-tuples.md。本方法同样适用于任何数据类型,是实际项目中最推荐的写法。
方法三:仅限数字——利用算术运算符交换
如果两个变量都是数字,还可以用加法/减法(+/-)或乘法/除法(*//)完成交换,原理是借助“和”与“差值”的数学关系来回推原值。
以加减法为例:
a = 11 b = 7 a = a + b # a = 18, b = 7 b = a - b # a = 18, b = 11 a = a - b # a = 7, b = 11 print(a) # 7 print(b) # 11逐步推演:
| 语句 | 数学含义 | a 的值 | b 的值 |
|---|---|---|---|
| 初始化 | — | 11 | 7 |
a = a + b | a 变为总和 | 18 | 7 |
b = a - b | b = 总和 − 原 b = 原 a | 18 | 11 |
a = a - b | a = 总和 − 原 a = 原 b | 7 | 11 |
适用性与局限:
- 仅适用于数字类型(整数、浮点数);
- 使用乘法/除法(
*//)时需保证除数不为 0; - 对于浮点数,加减运算可能引入微小的精度误差;
- 由于 Python 的
int是无界大整数(Python 3 自动升级为大整数),加减法在 Python 中不会出现其他语言里常见的整数溢出问题; - 逻辑清晰度低于前两种方法,可读性较差,适合在追求“零额外变量、零临时对象”的极简场景下使用。
三种方法对比与选型建议
| 方法 | 语法 | 适用类型 | 是否需临时变量 | 可读性 | 推荐度 |
|---|---|---|---|---|---|
| 临时变量法 | temp = a; a = b; b = temp | 任意类型 | 是 | 高 | 通用兜底 |
| 元组解包法 | a, b = b, a | 任意类型 | 否 | 最高 | 首选推荐 |
| 算术运算法 | a = a + b; ... | 仅数字 | 否 | 低 | 特殊场景 |
选型建议:
- 默认优先使用元组解包法,一行完成、语义清晰、无类型限制,这也是 Python 社区的事实标准写法;
- 当需要强调“不创建任何额外对象”或处于对临时对象敏感的嵌入式/高性能场景时,再考虑算术法(仅数字);
- 临时变量法虽略显繁琐,但在教学讲解、与不支持解包的旧代码风格对齐时仍有价值。
结语
变量交换是编程中最高频的基础操作之一。本文介绍的三种方法覆盖了“通用稳妥”“语法优雅”“极致精简”三条路线:日常开发推荐元组解包法,通用兜底用临时变量法,数字极简场景可用算术运算法。掌握这些写法,能帮助你在阅读与编写 Python 代码时一眼识别常见的交换与置换模式。仓库中的该系列文章以短小精悍的实战技巧为主,相关变体(如元组与列表差异、具名元组)可在 Python 集合 下继续探索。
- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
相关推荐
30-seconds-of-code 实战解析:JavaScript 清空数组的四种方法及引用陷阱
30 seconds of code 实战解析:JavaScript 清空数组的四种方法及引用陷阱 数组是 JavaScript 中最常用的数据结构之一,而"如
教程文档30-seconds-of-code 实战:JavaScript 对象添加键值对的五种方法全解析
30 seconds of code 实战:JavaScript 对象添加键值对的五种方法全解析 在 JavaScript 中,为对象添加键值对是一项基础却高频
教程文档30 seconds of Python代码重构:提升代码质量的实用方法
30 seconds of Python代码重构:提升代码质量的实用方法 你是否经常遇到代码冗长、可读性差、难以维护的问题?本文将介绍基于30 seconds
教程文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考