a,b=b,a的一个坑

>>> def func():
...   n=[3,4,1]
...   n[0], n[n[0]-1] = n[n[0]-1], n[0]
...   print(n)
... 
>>> func()
[3, 4, 1]

从代码逻辑上看,预期是要输出[1,4,3]的,但并不是。

用dis模块打印一下指令码:

>>> dis.dis(func)
  2           0 LOAD_CONST               1 (3)
              3 LOAD_CONST               2 (4)
              6 LOAD_CONST               3 (1)
              9 BUILD_LIST               3
             12 STORE_FAST               0 (n)

  3          15 LOAD_FAST                0 (n)
             18 LOAD_FAST                0 (n)
             21 LOAD_CONST               4 (0)
             24 BINARY_SUBSCR       
             25 LOAD_CONST               3 (1)
             28 BINARY_SUBTRACT     
             29 BINARY_SUBSCR       
             30 LOAD_FAST                0 (n)
             33 LOAD_CONST               4 (0)
             36 BINARY_SUBSCR       
             37 ROT_TWO             
             38 LOAD_FAST                0 (n)
             41 LOAD_CONST               4 (0)
             44 STORE_SUBSCR        
             45 LOAD_FAST                0 (n)
             48 LOAD_FAST                0 (n)
             51 LOAD_CONST               4 (0)
             54 BINARY_SUBSCR       
             55 LOAD_CONST               3 (1)
             58 BINARY_SUBTRACT     
             59 STORE_SUBSCR        

  4          60 LOAD_FAST                0 (n)
             63 PRINT_ITEM          
             64 PRINT_NEWLINE       
             65 LOAD_CONST               0 (None)
             68 RETURN_VALUE        

核心操作如下:

1、计算=号右边 n[n[0]-1] 的值

2、计算=号右边 n[0] 的值

3、往 n[0] 位置赋值,写入第1步的计算结果

4、往 n[n[0]-1] 位置赋值,写入第2步的计算结果。问题就出在这里,此时n[0]已经变了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值