首页
注册
登录
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
·
实用小工具
·
2774 人在线
最高记录 6679
·
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms ·
UTC 05:42
·
PVG 13:42
·
LAX 21:42
·
JFK 00:42
Developed with
CodeLauncher
♥ Do have faith in what you're doing.