Python中语句a = a, b = b, a的执行原理及结果疑问
关于Python变量交换语句的解析
先拆解你提出的核心问题:为什么a = a, b = b, a运行后,变量交换结果和a, b = b, a一致?我们一步步理清楚:
1. 标准变量交换的逻辑
a, b = b, a能实现交换的核心是Python的元组解包:
- 第一步:Python先计算右侧表达式,生成元组
(b的初始值, a的初始值),也就是(20, 10) - 第二步:把元组的两个元素依次赋值给左侧的
a和b,完成交换,最终a=20,b=10。
2. 你写的a = a, b = b, a到底是什么?
首先明确:这个语句在Python3中是语法错误——赋值语句不能作为元组的元素(除非用3.8+的海象运算符:=,但写法也不匹配)。但根据你描述的输出结果,大概率是输入时的笔误,实际等价于a, b = a, b = b, a(链式多重赋值):
- Python会先计算最右侧的
b, a,得到元组(20, 10) - 然后把这个元组依次赋值给左侧的两组
a, b:先给第一组a, b赋值(完成交换),再给第二组a, b重复赋值(结果不变) - 所以最终输出还是
20, 10,看起来前缀的赋值没影响,本质是重复赋值了同一个交换后的结果。
如果严格按照你写的语句强行运行(比如某些旧环境),结果会完全不同:
- 先执行
b = b, a:把b赋值为元组(20, 10) - 再执行
a = (a, b):把a赋值为(10, (20, 10)) - 这时候输出会是
((10, (20, 10)), (20, 10)),和你描述的结果不符,所以肯定是笔误导致的。
3. 对比代码的差异
你给出的对比代码:
a, b = b, a # 先完成交换,a=20,b=10 a = a, b # 把a重新赋值为元组(20, 10),b保持10不变
这时候a变成了包含交换后值的元组,b还是交换后的单个值,所以输出(20, 10) 10,和标准交换的结果差异明显。
内容的提问来源于stack exchange,提问作者disjointdrip87
相关产品推荐
相关产品推荐

