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

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

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

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

➢ 序列类型的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 "<stdin>", line 1, in <module>
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)的不可变,一是指元素对象的引用不可变,二是指不能对其再次赋值,但是在其中可变元素对象的引用不被修改的前提下,仍旧可以在此地址下对可变元素对象进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值