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 作为等号右边的符号了.