1
xiaofengchen 2018-04-01 17:36:42 +08:00 via Android
所以平时工作我们应该分开赋值,或者加括号?
|
2
yianing 2018-04-01 17:39:55 +08:00
恭喜 python 获得了和 c++同等的让人懵逼的技能😒
|
3
orangeade 2018-04-01 18:48:49 +08:00 via Android
用 id(a) 命令看一下
|
4
dickmrbean 2018-04-01 20:41:21 +08:00 11
In [1]: import dis
In [2]: dis.dis("a=b=c=1") 1 0 LOAD_CONST 0 (1) 2 DUP_TOP 4 STORE_NAME 0 (a) 6 DUP_TOP 8 STORE_NAME 1 (b) 10 STORE_NAME 2 (c) 12 LOAD_CONST 1 (None) 14 RETURN_VALUE |
5
tkmiles 2018-04-02 12:35:53 +08:00
1. 首先, 你发现没有, 就算你不先赋值 L, 也可以直接运行语句 L = L[len(L):]=L[len(L):] = [x]!!! 这说明了, python 是先赋值 L, 剩下的就很好理解了
2. 先赋值 L, 有 L=[4], 然后后一个 len 赋值, 有 L[len(L):]=L, 就是 L[1:] = L, 也就是 L[1:] = [4], 所以 L=[4, 4] 3. 然后第一个 len 赋值, 有 L[len[L]:] = L, L[2:] = L, L[2:]=[4, 4], 所以 L=[4, 4, 4, 4] 4. 看一下 dis In [3]: dis.dis("L = L[len(L):]=L[len(L):] = [x]") 1 0 LOAD_NAME 0 (x) 2 BUILD_LIST 1 4 DUP_TOP 6 STORE_NAME 1 (L) 8 DUP_TOP 10 LOAD_NAME 1 (L) 12 LOAD_NAME 2 (len) 14 LOAD_NAME 1 (L) 16 CALL_FUNCTION 1 18 LOAD_CONST 0 (None) 20 BUILD_SLICE 2 22 STORE_SUBSCR 24 LOAD_NAME 1 (L) 26 LOAD_NAME 2 (len) 28 LOAD_NAME 1 (L) 30 CALL_FUNCTION 1 32 LOAD_CONST 0 (None) 34 BUILD_SLICE 2 36 STORE_SUBSCR 38 LOAD_CONST 0 (None) 40 RETURN_VALUE 发现确实是先 BUILD_LIST, 然后 STORE_NAME 到 L 上, 然后后面的 STORE_SUBSCR 得去 debug 一下 python 的 C 代码了, 我 debug 下来发现, STORE_SUBSCR 赋值的时候, 赋值的对象确实是 L 自己, 也就是说 L[len(L):] = L, 这是因为之前赋值了 L = [4]之后, python 就直接用 L 作为等号右边的符号了. |
6
ggarlic 2018-04-02 14:04:21 +08:00
恩,python 的赋值运算符是右结合的
|
7
Sapp 2018-04-02 14:57:47 +08:00
js 还有个更坑的,a = { b : 1}, a.c = a = { d: 1} // a.c undefined,这毛病一直到 es6 的 let 才给解决。
|
8
KingHL 2018-04-02 21:37:14 +08:00
好好的 python,非要被你这样用。
|