Python的Tuple也会变?

我们知道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的什么才是可变对象和不可变对象。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180604G1VZA000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券