元组中列表的增量赋值问题
元组是不可变的,列表是可以修改的,
那么对元组中的列表进行修改会有什么问题。
cmd 运行:
t=(1,2,[30,40])
t[2] += [50,60]
的结果会出现两种情况:
(1)t 变成:(1, 2, [30, 40, 50, 60])
(2)因为tuple不支持对他的元素赋值,所以会抛出typeError异常。
元组赋值的初始和最终状态图
下面看示例中Python为表达式 S[a] += b 生成的字节码。
1、将S[a] 的值存入TOS (Top Of Stack, 栈的顶端)
2、计算 TOS += b。 这一步能够完成, 是因为 TOS 指向的是一个可变对
象
3、s[a] = TOS 赋值。 这一步失败, 是因为 s 是不可变的元组
结论:
a、最好不要把可变对象放到元组里面
b、增量赋值不是一个原子操作。
c、可以通过dis查看python字节码,对了解代码运行机制很有帮助。
注:本内容参考自 《fluent python》