Python 1 - 内置类型 - 序列(1)
Python 中提供了 3 种基本的序列类型:list、tuple、range。大家可能对这3中类型都比较熟悉。
一般我们认为 tuple类型是不可以改变的list,当然,这在日常使用中,并没有什么不对,表现出来的属性也能验证这个说法,但是,在Python的底层实现当中,tuple 与 list 是完全不同的两个类型,后面我们会对他们的不同之处加以分析。
语句range(n)大家在for in 语句中经常使用,一般作为index来遍历其他类型的迭代。我们在使用的时候一般认为range(start, stop, step)方法产生了一个以start开始,stop结束,以step为间隔的列表。但是实际上,range也是一种基本的序列类型,它也并不会返回一个我们认为的list。
可变序列
不可变序列类型与可变序列的区别就是,可变类型没有实现对 hash() 内置函数的支持。这种对hash()的支持,可以让 tuple作为dict的键存在。
像list,bytearray就是可变序列。
不可变序列
不可变序列类型的对象一旦创建就不能再改变:如果对象包含了对其他对象的引用,其中的可变对象就是可改变的;但是一个不可变对象所直接引用的对象集是不能改变的。
像 str,tuple,bytes都是不可变对象。相应的不可变序列就有 tuple 和 range,它们都是可以被hash()所使用的。
关于可变对象和不可变对象官方给出的例子。
我们打算对元组的元素进行自增运算,所以我们使用了 +=。
>>> a=(1,2)
>>> a[0] += 1
Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
报错信息告诉我们,元组对象不支持元素赋值。
发生异常的原因是显而易见的:
1 会与对象 a_tuple[0] 相加,而该对象为 (1),得到结果对象 2,
但当我们试图将运算结果 2 赋值给元组的 0 号元素时就将报错,因为我们不能改变元组的元素所指向的对象。
在表层之处,以上增强赋值语句所做的大致是这样:
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
我们打算给元组中