>>> 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]已经变了。