![]() | 1 huangzhe8263 2018-08-26 15:29:50 +08:00 b, a 返回的是一个 tuple 然后 a, b 分别赋值为第一个和第二个 就是 (a, b) = (b, a) |
2 fwee 2018-08-26 15:33:48 +08:00 学一学编译和解释器的概念 |
![]() | 3 kkk330 2018-08-26 15:35:57 +08:00 via iPhone ![]() dis 看看 |
![]() | 4 Wincer 2018-08-26 15:37:37 +08:00 via Android Python 元组拆包,当 a, b = b, a 的时候,会把 b, a 看做一个可迭代对象,依次赋值给 a, b 组成的元组 |
![]() | 5 jmc891205 2018-08-26 16:16:43 +08:00 用 dis 看一看汇编就懂了 |
![]() | 6 wocanmei 2018-08-26 16:18:29 +08:00 via iPhone 个人觉得这只不过是一种语法糖,虽然没写中间变量底层说不定用了 |
![]() | 7 nazor 2018-08-26 16:23:34 +08:00 CAS |
![]() | 8 hhsuan 2018-08-26 16:35:51 +08:00 via Android 如果是这么个问法,我觉得任何语言都可以不用变量交换两个值。 |
![]() | 9 codechaser 2018-08-26 16:38:56 +08:00 via Android unpacking,也就是多个产量负值时序列的拆包。简易写法 |
![]() | 10 zhicheng 2018-08-26 16:43:29 +08:00 via iPhone 虽然没有用临时变量,但是用了栈。 |
![]() | 11 hx1997 2018-08-26 16:46:37 +08:00 via Android ![]() |
12 adek06 2018-08-26 17:21:44 +08:00 同意一楼的说法 |
![]() | 14 Yourshell 2018-08-26 17:29:57 +08:00 via iPhone 你没看到不代表不存在 |
![]() | 15 msg7086 2018-08-26 17:35:11 +08:00 ![]() 背后相当于做了:(伪代码) tmp = [a, b] a = tmp[1] b = tmp[0] 和内存地址没什么关系。各种语言不同的写法最后都会被编译成类似的机器代码。 |
![]() | 16 Alerta OP 感谢各位大神,原来答案不只是拆包。现在优化了之后,在 2、3 个值分配的时候是直接运用栈,在 3 个以上值分配的时候才是用了拆包的原理。 详细答案在 11 楼哥们的链接里: https://stackoverflow.com/questions/21047524/how-does-swapping-of-members-in-the-python-tuples-a-b-b-a-work-internally |
![]() | 17 momocraft 2018-08-26 18:31:32 +08:00 都用 python 了就别想着"内存地址"了 |
![]() | 18 Feva 2018-08-26 19:52:27 +08:00 不爱思考的新手 |
![]() | &nsp; 19 Yggdroot 2018-08-26 20:19:54 +08:00 只是语法糖而已,如果有一种新的语言,甚至可以这样表示交换两个变量: `a<->b` |
![]() | 20 Pythondr 2018-08-26 20:23:28 +08:00 via Android 元组的自动组包与自动解包 |
![]() | 21 inframe 2018-08-26 21:38:09 +08:00 via Android python 是个栈机,push pop 一波搞定 |
![]() | 22 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 |
![]() | 23 Joshua999 2018-08-26 22:09:28 +08:00 via Android 想知道只用加减法怎么实现,不用临时变量交换两个值 |