python同时赋值_Python 的赋值坑 , a=b=c=1???

2022-10-25 11:59:11

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

  • 作者:weixin_39825854
  • 原文链接:https://blog.csdn.net/weixin_39825854/article/details/110031158
    更新时间:2022-10-25 11:59:11