赞
踩
在进入今天的主题之前,首先,我们需要先对元组有一个基础的了解。
➢元组(tuple)是序列类型中比较特殊的类型。
>>> 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)的不可变,一是指元素对象的引用不可变,二是指不能对其再次赋值,但是在其中可变元素对象的引用不被修改的前提下,仍旧可以在此地址下对可变元素对象进行修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。