关于 Python 不使用临时变量来交换两个值的原理

2018-08-26 15:22:48 +08:00
 Alerta
用其他语言交换两个值,而且不用临时变量不是用加减法就是用异或法,但是 python 就直接

a,b =b,a

即可

我很好奇其中的原理是什么,我一开始的猜想是 Python 直接交换了 a,b 引用的内存地址,求各位大神解答
7012 次点击
所在节点    Python
28 条回复
inframe
2018-08-26 21:38:09 +08:00
python 是个栈机,push pop 一波搞定
scriptB0y
2018-08-26 22:03:22 +08:00
@wocanmei 其实没有用中间变量吧。

只不过 Python 的解释器支持一个字节码,ROT_TWO,可以直接交换栈顶的两个变量。其他的语言没有这个功能而已。应该也不能叫做是语法糖。

dis 查看方法:

https://gist.github.com/laixintao/bb4330651c33124d52ff888b99c9e939

Python ROT_TWO 文档:

https://docs.python.org/3/library/dis.html#opcode-ROT_TWO

ROT_TWO
Swaps the two top-most stack items.

cc @Alerta
Joshua999
2018-08-26 22:09:28 +08:00
想知道只用加减法怎么实现,不用临时变量交换两个值
Alerta
2018-08-26 22:52:24 +08:00
@Joshua999 百度一下有很多
Alerta
2018-08-26 22:52:38 +08:00
@scriptB0y 感激感激
tyx1703
2018-08-27 00:21:48 +08:00
a = a + b
b = a - b
a = a - b

@Joshua999
wocanmei
2018-08-27 08:51:10 +08:00
@scriptB0y #22 多谢科普
Joshua999
2018-08-27 15:30:39 +08:00
@tyx1703 当时脑抽,看了半天没想出来,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX