Python 中 list[1],list[2]=list[2],list[1]的实现原理

2019-03-10 11:48:54 +08:00
 shanghj

因为自己太笨了,实在想不通,所以来这里请教一下各位大佬。谢谢

2513 次点击
所在节点    Python
7 条回复
tdk1738
2019-03-10 11:55:36 +08:00
闭包和拆包吧
lance6716
2019-03-10 12:01:35 +08:00
rot_two
wwqgtxx
2019-03-10 12:02:00 +08:00
这种只要有个栈不是很好实现么
push(list[2])
push(list[1])
list[2]=pop()
list[1]=pop()
binux
2019-03-10 12:02:29 +08:00
实现原理就是,Guido 想要 unpacking,于是就有了 unpacking
inframe
2019-03-10 12:20:57 +08:00
python 虚拟机是个完全的栈机
shanghj
2019-03-10 12:35:17 +08:00
很感谢各位大佬的回复,实现原理已经了解。
对于二楼的大佬的 ROT_TWO 的补充:
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
from dis import dis


def demo(a, b):
print(a,b)
a, b = b, a
print('new: ', a,b)


a, b = 2, 3
demo(a,b)
dis(demo)
‘’‘
输出结果:(重点在 ROT_TWO)
2 3
new: 3 2
6 0 LOAD_GLOBAL 0 (print)
2 LOAD_FAST 0 (a)
4 LOAD_FAST 1 (b)
6 CALL_FUNCTION 2
8 POP_TOP

7 10 LOAD_FAST 1 (b)
12 LOAD_FAST 0 (a)
14 ROT_TWO
16 STORE_FAST 0 (a)
18 STORE_FAST 1 (b)

8 20 LOAD_GLOBAL 0 (print)
22 LOAD_CONST 1 ('new: ')
24 LOAD_FAST 0 (a)
26 LOAD_FAST 1 (b)
28 CALL_FUNCTION 3
30 POP_TOP
32 LOAD_CONST 0 (None)
34 RETURN_VALUE
’‘’
darkTianTian
2019-03-11 00:24:22 +08:00
你可以把右边想象成元组,
左边实际应用了元组拆包
`list[1], list[2] = (list[2], list[1])`

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

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

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

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

© 2021 V2EX