Python学习笔记之tuple
一、tuple的基础概念---被限制的列表
另一组有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。我们创建一个如下的元组。
现在元组已经创建成功,初始化完成,他的值不能再被做任何修改,它也没有append(),insert()这些方法,但是他获取元素和列表一样的方法一样,还是使用索引,例如tuple1[1]
在上一节我们说过列表,列表可以存放任何数据类型,也可以随时对元素做出修改,但是这样的话列表的“权利”过于大了,是的我们的数据安全的得不到保证,但是tuple就不一样他和列表一样,他也可以存放任何数据类型的元素,也可以使用索引,切片,就是不能能更改元组中的任何数据,我们的元组在定义的时候,元组的数据就已经被确定下来。因此我们也可以认为元组就是一种被限制的列表
二、tuple的定义
(1)定义一个普通的元组
就如同刚开始时我们的例子那样,定义一个带有多个数据的元组,我们需要注意的时 元组使用的是 ‘()’,而不是
‘[ ]' 其中每个元素使用逗号隔开。但是我们也可以不使用()如下:
(2)定义一个空元祖
上一节,定义一个空列表我们使用的方法是 list1= [ ] ,同样定义一个空的元组 我们使用的是 tuple1 = ( )。(3)定义一个只有一个元素的元组
我们在定义只有一个元素的元组时如果下面这样是错误的
我们在这里定义的实际上不是一个元组,而是一个存放数值为1的整形变量,因为python解释器并不能分辨此时的()是属于数学中的计算符号,还是元组中的()。解释器有规定此时这种情况(1) 将其当做小括号计算,因此tuple3是一个整型变量。
我们在定义时使用 ,作为一个“占位符”这样就可以被识别了
三、“可变元组”
我们在上面说过元组是在定义之后其元素将不可被更改,但是为什么又有可变元组呢?其实在这里元组还
是不可变的。这就要说到我们的内存模型了。
首先我们来看一个“可变的元组”。
我们表面上看元组的数据改变了,但是实际上改变的是list1,元组中的每一个元素都指向一个内存块,而我们的list1 指向的依旧是原来的那个内存块。因此我们要正确理解元组是不可变的:元组的不可变是指元组中的变量所指向的内存不改变。(可以使用id()函数来观察元组甚至是元组的每个元素的指向地址)
我们如果需要创建一个完全不可变的元组,那我们就需要保证元组的每一个元素本身也不可变。
四、元组的复制
在列表的拷贝时我们使用了切片进行列表的深拷贝,避免了拷贝后的变量和被拷贝的变量同时指向同一个内存块。
同样我们在元祖中如果仅仅只是使用 = 进行拷贝也会出现下面情况
那么如果我们使用了切片进行拷贝会不会还是这种情况呢,我们试一试。
如上所示我们使用切变也是不可以的,因此Python解释器的实现导致的,由于tuple是immutable的,所以说没有必要在内存里多维护一个字面意义一样的tuple(元组不可变),因此Python对于tuple的拷贝仅仅只是增加的一个指向而已,并没有做到真正的拷贝。
如果们真的需要进行元组的深拷贝,那么我们需要使用下面方法
我们可以记住元组使用想要深拷贝需要使用copy文件(import)和深拷贝函数( copy.deepcopy() )。
五、元组操作符
和序列一样我们的元组也有许多可以用的操作符,比如关系运算符(大于、等于、小于)、"*" 、"+" 、in 、not in 等等。其规则使用方式和列表一样