☰
30 Seconds of Code 解读:Python 变量交换的 3 种实用方法
2026/10/5 6:44:33 网站建设 项目流程
  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载

本指南基于 swap-variables.md 一文,系统讲解 Python 中交换两个变量值的三种方法:临时变量法、元组打包/解包法(无需临时变量)与算术运算法(仅限数字)。读完本文,你将掌握每种方法的完整写法、底层原理与适用场景,并能根据数据类型的差异在真实项目中做出正确选择。三种方法均属于该仓库 Python 系列(Python 集合,面向 Python 3.6)的基础变量操作技巧,可直接用于日常编码。

方法一:使用临时变量(temp variable)

这是最直观、也是最经典的交换方式:借助第三个变量temp暂存其中一个变量的值,再依次完成赋值。

其核心思路分三步:

  1. 先把a的值暂存到temp(temp = a);
  2. 再把b的值赋给a(a = b);
  3. 最后把暂存在temp中的原值赋给b(b = temp)。
a = 11 b = 7 temp = a a = b b = temp print(a) # 7 print(b) # 11

执行过程拆解:

语句a 的值b 的值temp 的值
初始化117—
temp = a11711
a = b7711
b = temp71111

适用性与局限:该方法对任意数据类型(数字、字符串、列表、字典、自定义对象等)都成立,是三类方法中通用性最强的一种。缺点是需要额外开辟一个临时变量,略显冗长。

方法二:无需临时变量——元组打包与序列解包(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 的值
初始化—117
a = a + ba 变为总和187
b = a - bb = 总和 − 原 b = 原 a1811
a = a - ba = 总和 − 原 a = 原 b711

适用性与局限:

  • 仅适用于数字类型(整数、浮点数);
  • 使用乘法/除法(*//)时需保证除数不为 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

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载
上一篇:如何快速提升AMD显卡性能:免费驱动精简终极指南
下一篇:Nuke Survival Toolkit实战指南:150个高效插件重构专业合成工作流

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询