在我们使用Python的过程中, 经常遇到赋值语句, 就像下面的那样:
a = 3
b = 3
可能你会觉得我又要说什么变量赋值就是引用, 这么简单的知识就不讨论啦, 相信聪明的大家肯定都知道的, 我想讲的是链式赋值...可能大家一眼看下去, 就能得出答案:
i 的值: 3
s 的值: [3, 2, 3, 4, 5, 6]
然而, 这个答案只是对了一半, 因为s的值错了!...第3行:
LOAD_CONST取出常量3, 它并不是像上面执行STORE_NAME, 而是采用DUP_TOP, 这是什么鬼, 我们这要去看下这指令具体是干嘛的:
//取自 python/ceval.c...(省略)
}
DUP_TOP指令说白了, 就是将刚才LOAD_CONST指令取出的常量3, 复制一份给v,然后再压回去运行栈帧, 这样就有两个3了, 为什么要这么做, 肯呢个大家已经猜到了, 不过我们还是得继续看具体是不是像我们想的那样...所以看到这, 相信大家都能清楚, 为什么结果是 [1, 2, 3, 3, 5, 6]
这跟我们想象中的链式赋值很不同, 我们以前总是觉得, 赋值要从右到左依次执行, 先执行 s[i] = 3, 再执行