V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  prm  ›  全部回复第 1 页 / 共 1 页
回复总数  2
2016-07-25 23:08:01 +08:00
回复了 strahe 创建的主题 Python 关于 Python 的一个问题
归根结底这是 Python 语言设计的锅, python 定义了与各种 operator 等价的 magic method (双下划线 method ,比如__iadd__是+=,当然,也就是后来编译出来的 INPLACE_ADD),当你从语法上玩弄语义的时候(+=, []= 合并成了 x[y]+=z ),就被自己玩了。。
2016-07-25 23:03:36 +08:00
回复了 strahe 创建的主题 Python 关于 Python 的一个问题
并不是一个 Bug ,来看一下 byte code

$ py -3
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from dis import dis
>>> dis('''
... a = (1, [1,2,3], 'a')
... a[1] += [4]
... ''')
2 0 LOAD_CONST 0 (1)
3 LOAD_CONST 0 (1)
6 LOAD_CONST 1 (2)
9 LOAD_CONST 2 (3)
12 BUILD_LIST 3
15 LOAD_CONST 3 ('a')
18 BUILD_TUPLE 3
21 STORE_NAME 0 (a)

3 24 LOAD_NAME 0 (a)
27 LOAD_CONST 0 (1)
30 DUP_TOP_TWO
31 BINARY_SUBSCR
32 LOAD_CONST 4 (4)
35 BUILD_LIST 1
38 INPLACE_ADD
39 ROT_THREE
40 STORE_SUBSCR
41 LOAD_CONST 5 (None)
44 RETURN_VALUE

a[1] += [4]实际是两部操作,+= 和 []=

INPLACE_ADD 是 +=
STORE_SUBSCR 是 []=

先发生了+=,然后 []= 报错了。仅此而已。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   947 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 20:59 · PVG 04:59 · LAX 12:59 · JFK 15:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.