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

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

a,b =b,a

即可

我很好奇其中的原理是什么,我一开始的猜想是 Python 直接交换了 a,b 引用的内存地址,求各位大神解答
7156 次点击
所在节点    Python
28 条回复
huangzhe8263
2018-08-26 15:29:50 +08:00
b, a 返回的是一个 tuple
然后 a, b 分别赋值为第一个和第二个
就是
(a, b) = (b, a)
fwee
2018-08-26 15:33:48 +08:00
学一学编译和解释器的概念
kkk330
2018-08-26 15:35:57 +08:00
dis 看看
Wincer
2018-08-26 15:37:37 +08:00
Python 元组拆包,当 a, b = b, a 的时候,会把 b, a 看做一个可迭代对象,依次赋值给 a, b 组成的元组
jmc891205
2018-08-26 16:16:43 +08:00
用 dis 看一看汇编就懂了
wocanmei
2018-08-26 16:18:29 +08:00
个人觉得这只不过是一种语法糖,虽然没写中间变量底层说不定用了
nazor
2018-08-26 16:23:34 +08:00
CAS
hhsuan
2018-08-26 16:35:51 +08:00
如果是这么个问法,我觉得任何语言都可以不用变量交换两个值。
codechaser
2018-08-26 16:38:56 +08:00
unpacking,也就是多个产量负值时序列的拆包。简易写法
zhicheng
2018-08-26 16:43:29 +08:00
虽然没有用临时变量,但是用了栈。
hx1997
2018-08-26 16:46:37 +08:00
adek06
2018-08-26 17:21:44 +08:00
同意一楼的说法
Alerta
2018-08-26 17:28:18 +08:00
@kkk330 dis 是??
Yourshell
2018-08-26 17:29:57 +08:00
你没看到不代表不存在
msg7086
2018-08-26 17:35:11 +08:00
背后相当于做了:(伪代码)

tmp = [a, b]
a = tmp[1]
b = tmp[0]

和内存地址没什么关系。各种语言不同的写法最后都会被编译成类似的机器代码。
Alerta
2018-08-26 17:39:52 +08:00
感谢各位大神,原来答案不只是拆包。现在优化了之后,在 2、3 个值分配的时候是直接运用栈,在 3 个以上值分配的时候才是用了拆包的原理。
详细答案在 11 楼哥们的链接里: https://stackoverflow.com/questions/21047524/how-does-swapping-of-members-in-the-python-tuples-a-b-b-a-work-internally
momocraft
2018-08-26 18:31:32 +08:00
都用 python 了就别想着"内存地址"了
Feva
2018-08-26 19:52:27 +08:00
不爱思考的新手
Yggdroot
2018-08-26 20:19:54 +08:00
只是语法糖而已,如果有一种新的语言,甚至可以这样表示交换两个变量:
`a<->b`
Pythondr
2018-08-26 20:23:28 +08:00
元组的自动组包与自动解包

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

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

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

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

© 2021 V2EX