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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值