序列类型之元组(可变与不可变)

在进入今天的主题之前,首先,我们需要先对元组有一个基础的了解。

元组(tuple)是序列类型中比较特殊的类型。

  • 元组一旦创建就不能被修改。
  • 常用情况:元组类型在表达固定数据项、函数多返回值、多变量同步赋值、循环遍历。
  • Python中元组采用逗号和圆括号(可选)来表示,其中,逗号 “ , ”是必须的。
>>> creature = "cat","dog","tiger"
>>> type(creature)

>>> creature1 = ("cat","dog","tiger")
>>> type(creature1)

➢ 序列类型的12个通用函数和操作符

操作符 描述说明
x in s 如果x是序列s中的元素,则返回True,否则返回False
x not in s 如果x不是序列s中的元素,则返回True,否则返回False
x + y 连接序列x和y
s * n 或 n * s 将序列x复制n次
s[i] 索引,返回序列的第i个元素
s[i:j] 分片,返回包含序列s第i个到第j - 1个元素的子序列
s[i:j:k] 步骤分片,返回包含序列s第i个到第k - 1个元素,以j为跳度的子序列
len(s) 返回序列s的元素个数,即长度
min(s) 返回序列s中的最小元素
max(s) 返回序列s中的最大元素
s.index(x[,i[,j]]) 序列s中从i开始到j结束的范围中第一次出现元素x的位置
s.count(x) 序列s中x出现的总次数

在上面,我们就提到了元组一旦创建就不能再修改。但我们来看一下下面这段代码。

>>> some_tuple = ([1],2,3)
>>> some_tuple[0] += [2]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'tuple' object does not support item assignment
>>> some_tuple
([1, 2], 2, 3)

没错,我们可以看到程序虽然抛出异常,但元组的确是通过“ += ”被修改了。

“+=”是本地操作,会将“可变对象”进行原地修改,而tuple中 += 是两个过程,即A+=B其实就等价于A=A+B,先 + 再 =,所以+操作时就已经已经修改了原对象,但是再次赋值就触犯了元组不能修改的规则,是以抛出异常。

  • +=, -=, =, /=, //=, %=, *=, <<=, >>=, &=, ^=, |=这些操作符都是原地修改可变对象,不会改变对象,即是此变量创立的存储地址(id)不会被改变。

➢数字、元组、字符串都是不可变对象。

>>> s = [1,2,3,4]
>>> id(s)
2473956988936
>>> s += [5]
>>> print(s)
[1, 2, 3, 4, 5]
>>> id(s)
2473956988936

但通过下面这种方式可以对元组进行一定的修改。

>>> b = some_tuple[0]
>>> id(b)
2473986685704
>>> b += [3]
>>> id(b)
2473986685704
>>> b
[1, 2, 3]
>>> some_tuple
([1, 2, 3], 2, 3)
>>> id(some_tuple[0])
2473986685704

从上面可以看出,tuple不支持=这种赋值操作,但是对其中可变元素的原地修改是可以的。
➢所以,在此,发表一下自己浅显的认识:元组(tuple)的不可变,一是指元素对象的引用不可变,二是指不能对其再次赋值,但是在其中可变元素对象的引用不被修改的前提下,仍旧可以在此地址下对可变元素对象进行修改。

你可能感兴趣的:(序列类型之元组(可变与不可变))