元组中列表的增量赋值问题

元组是不可变的,列表是可以修改的,

那么对元组中的列表进行修改会有什么问题。

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》