Python中的 A += B 赋值谜题
在Python控制台上预测这两个表达式的输出
- 在控制台上
Geek = (1, 2, [8, 9]) Geek[2] += [3, 4]
输出:
解释:- 查看Python为表达式 s[a] += b 生成的字节码。很清楚这是如何发生的。
- 它一步一步地工作
- 将 s[a] 的值放在栈顶(TOS)上。
- 执行 TOS += b。这成功了,如果 TOS 引用了一个可变对象。这就是将项目附加到列表成功的原因。
- 分配 s[a] = TOS。这失败了,如果 s 是不可变的。 TypeError,因为在上面的例子中元组是不可变的。
需要学习的东西
- 将可变项放在元组中并不是一个好主意。
- 增强赋值不是原子操作——我们只是看到它在完成部分工作后抛出异常。
- 检查Python字节码并不太难,而且通常有助于了解幕后发生的事情。
- 查看Python为表达式 s[a] += b 生成的字节码。很清楚这是如何发生的。