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

28 条回复 • 2018-08-27 15:30:39 +08:00

303225_normal.png?m=1535024734

1

2018-08-26 15:29:50 +08:00

b, a 返回的是一个 tuple

然后 a, b 分别赋值为第一个和第二个

就是

(a, b) = (b, a)

024ae927f871b0c95668025e90945629?s=48&d=retro

2

2018-08-26 15:33:48 +08:00

学一学编译和解释器的概念

163988_normal.png?m=1466769290

3

2018-08-26 15:35:57 +08:00 via iPhone heart_neue_red.png?v=16ec2dd0a880be6edda1e4a2e35754b3 1

dis 看看

246175_normal.png?m=1536898790

4

2018-08-26 15:37:37 +08:00 via Android

Python 元组拆包,当 a, b = b, a 的时候,会把 b, a 看做一个可迭代对象,依次赋值给 a, b 组成的元组

4930_normal.png?m=1294557252

5

2018-08-26 16:16:43 +08:00

用 dis 看一看汇编就懂了

342963_normal.png?m=1534759393

6

2018-08-26 16:18:29 +08:00 via iPhone

个人觉得这只不过是一种语法糖,虽然没写中间变量底层说不定用了

33075_normal.png?m=1548741148

7

2018-08-26 16:23:34 +08:00

CAS

340133_normal.png?m=1533895874

8

2018-08-26 16:35:51 +08:00 via Android

如果是这么个问法,我觉得任何语言都可以不用变量交换两个值。

458329b847465add45588a04f378066e?s=48&d=retro

9

2018-08-26 16:38:56 +08:00 via Android

unpacking,也就是多个产量负值时序列的拆包。简易写法

14055_normal.png?m=1376380375

10

2018-08-26 16:43:29 +08:00 via iPhone

虽然没有用临时变量,但是用了栈。

ef6bf7fa9a511160ab7306e78fc09f74?s=48&d=retro

12

2018-08-26 17:21:44 +08:00

同意一楼的说法

197277_normal.png?m=1534770796

13

2018-08-26 17:28:18 +08:00

@kkk330 dis 是??

80796_normal.png?m=1588933344

14

2018-08-26 17:29:57 +08:00 via iPhone

你没看到不代表不存在

38436_normal.png?m=1560377701

15

2018-08-26 17:35:11 +08:00 heart_neue_red.png?v=16ec2dd0a880be6edda1e4a2e35754b3 1

背后相当于做了:(伪代码)

tmp = [a, b]

a = tmp[1]

b = tmp[0]

和内存地址没什么关系。各种语言不同的写法最后都会被编译成类似的机器代码。

17f2e18da0338911cd6ea464ff2613d1?s=48&d=retro

17

2018-08-26 18:31:32 +08:00

都用 python 了就别想着"内存地址"了

57390_normal.png?m=1491031671

18

2018-08-26 19:52:27 +08:00

不爱思考的新手

189103_normal.png?m=1472352505

19

2018-08-26 20:19:54 +08:00

只是语法糖而已,如果有一种新的语言,甚至可以这样表示交换两个变量:

`a<->b`

269986_normal.png?m=1511529737

20

2018-08-26 20:23:28 +08:00 via Android

元组的自动组包与自动解包

112249_normal.png?m=1581560773

21

2018-08-26 21:38:09 +08:00 via Android

python 是个栈机,push pop 一波搞定

204213_normal.png?m=1481353826

22

2018-08-26 22:03:22 +08:00

@wocanmei 其实没有用中间变量吧。

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

dis 查看方法:

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

ROT_TWO

Swaps the two top-most stack items.

cc @Alerta

2b189eee1f615bcfba2eadd630208ec2?s=48&d=retro

23

2018-08-26 22:09:28 +08:00 via Android

想知道只用加减法怎么实现,不用临时变量交换两个值

197277_normal.png?m=1534770796

24

2018-08-26 22:52:24 +08:00

197277_normal.png?m=1534770796

25

2018-08-26 22:52:38 +08:00

259933_normal.png?m=1514131097

26

2018-08-27 00:21:48 +08:00 via Android

a = a + b

b = a - b

a = a - b

@Joshua999

342963_normal.png?m=1534759393

27

2018-08-27 08:51:10 +08:00 via iPhone

@scriptB0y #22 多谢科普

2b189eee1f615bcfba2eadd630208ec2?s=48&d=retro

28

2018-08-27 15:30:39 +08:00 via Android

@tyx1703 当时脑抽,看了半天没想出来,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值