我们知道Python中列表有两种类型一种是可变的list类型,另一种是不可变的tuple类型。按照这种推理,tuple类型应该类似于Python中字符型和整形一样属于不可变对象。Tuple究竟算是可变对象还是不可变对象呢,让我们先看一下下面这个例子。
我们看到当tuple中的元素是可变的list时,tuple是可以变化的。而对于list两种方式的改变,tuple表现出不同的行为,究竟是为什么呢?让我们先通过Python的字节码来看下上段代码运行的过程。
通过append函数
通过 += 运算
从上面Python执行的字节码可以看出,通过append函数改变tuple时并未改变Tuple对象本身(BUILD_TUPLE),而通过+=运算方式会改变Tuple对象本身(BUILD_SET),而Tuple对象本身在Python中是不能被改变的。
下面我们从Python源码的角度看一下Tuple类型的实现。
Tuple类型是通过PyTupleObject来构建的,包含头对象和元素对象列表。头对象PyObject_VAR_HEAD表明Tuple并非是不可变的。
元素对象列表包含的都是最基本的PyObject对象。
当上述代码通过+=运算改变Tuple时,会调用下面的赋值函数。
而sq_ass_item在Tuple类型属性的定义中是0,所以会抛出上述实例的异常。
至此,你了解Tuple不可变的含义了吗?其实就是要深入理解Python的什么才是可变对象和不可变对象。
领取专属 10元无门槛券
私享最新 技术干货