首页
注册
登录
prm 最近的时间轴更新
prm
V2EX 第 177065 号会员,加入于 2016-06-12 18:36:10 +08:00
PrMaple
pochen.me/
princemaple
prm
提问
技术话题
好玩
工作信息
交易信息
城市相关
prm 最近回复了
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 是 []=
先发生了+=,然后 []= 报错了。仅此而已。
»
prm 创建的更多回复
关于
·
帮助文档
·
博客
·
API
·
FAQ
·
实用小工具
·
1012 人在线
最高记录 6679
·
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms ·
UTC 21:51
·
PVG 05:51
·
LAX 13:51
·
JFK 16:51
Developed with
CodeLauncher
♥ Do have faith in what you're doing.