实际上元组是跟列表非常相近的另一种容器类型.元组和列表看起来不同的一点是元组用的是圆括号而列表用的是方括号。而功能上,元组和列表相比有一个很重要的区别,元组是一种不可变类型。正因为这个原因,元组能做一些列表不能做的事情。比如用做一个字典的key。另外当处理一组对象时,这个组默认是元组类型.比如 x, y = 1, 2 ; x, y ---->(1, 2)
所以呢,在这一章节,我们基本就不再从头到尾挨个说了,它和列表的基本操作都是一样的。
我们重点说一下元组和列表间的转换以及元组和列表的区别。
在三个标准不可变类型里面--数字,字符串和元组字符串--元组是受到影响最大的,一个数据类型是不可变的,简单来讲,就意味着一旦一个对象被定义了,它的值就不能再被更新,除非重新创建一个新的对象.对数字和字符串的影响不是很大,因为它们是标量类型,当它们代表的值改变时,这种结果是有意义的,是按照你所想要的方式进行访问的,而对于元组,事情就不是这样了。因为元组是容器对象,很多时候你想改变的只是这个容器中的一个或者多个元素,不幸的是这是不可能的,切片操作符不能用作左值进行赋值。这和字符串没什么不同,切片操作只能用于只读的操作。但是不可变并不是坏事,比如我们把数据传给一个不了解的API 时,可以确保我们的数据不会被修改。同样地,如果我们操作从一个函数返回的元组,可以通过内建list()函数把它转换成一个列表.
当你确实需要对元组中的某些元素进行修改,我们可以通过list()先把元组转换成列表类型进行编辑;同样当我们编辑完列表,需要将列表“封装”起来,我们可以通过tuple()函数将字符串或列表转换成元组。这个过程在实际解决问题过程中也是使用最为频繁的。
但是,尽管元组具有不可变性,但也不是意味着一点招没有,字符串也具有不可变性,但仍然可以通过“+”连接操作符进行连接,尽管这个过程是创建了一个新的对象,但从解决问题的实际角度考虑,我们最终的目的不是判断是不是同一个目的,而仅仅是想得到所需要的新的字符串而已。所以元组也可以进行类似的操作。
列表 VS 元组
为什么我们要区分元组和列表变量?这个问题也可以被表述为“我们真的需要两个相似的序列类型吗?”,一个原因是在有些情况下,使用其中的一种类型要优于使用另一种类型。最好使用不可变类型变量的一个情况是,如果你在维护一些敏感的数据,并且需要把这些数据传递给一个并不了解的函数(或许是一个根本不是你写的API),作为一个只负责一个软件某一部分的工程师,如果你确信你的数据不会被调用的函数篡改,你会觉得安全了许多。一个需要可变类型参数的例子是,如果你在管理动态数据集合时。你需要先把它们创建出来,逐渐地或者不定期的添加它们,或者有时还要移除一些单个的元素。这是一个必须使用可变类型对象的典型例子。幸运的是,通过内建的list()和tuple()转换函数,你可以非常轻松的在两者之间进行转换.list()和tuple()函数允许你用一个列表来创建一个元组,反之亦然.如果你有一个元组变量,但你需要一个列表变量因为你要更新一下它的对象,这时list()函数就是你最好的帮手.如果你有一个列表变量,并且想把它传递给一个函数,或许一个API,而你又不想让任何人弄乱你的数据,这时tuple()函数就非常有用。