前言
今天这篇文章接着介绍 不可变序列 元组。
元组
元组是python内置的数据结构之一,有序,可多种不同数据类型的元素混合存储,允许有重复数据,是不可变序列(所以没有元组生成式)。
创建
1 直接小括号 yuanzu=('hello','world',10)
2 使用内置函数tuple() yuanzu=tuple(('python','hello',0))
3 注意:只包含一个元组的元素需要使用逗号和小括号 yuanzu=('helloworld',) 不加逗号会认为是
str类型。
yuanzu=('hello','world',90) print(yuanzu,type(yuanzu)) #('hello', 'world', 90) <class 'tuple'> # 省略小括号创建元组 yuanzu1='hello','world',90 print(yuanzu1,type(yuanzu1)) #('hello', 'world', 90) <class 'tuple'> yuanzu3=('helloworld',) print(yuanzu3,type(yuanzu3)) #('helloworld',) <class 'tuple'> # 使用函数tuple() yuanzu2=tuple(('hello','world',80)) print(yuanzu2,type(yuanzu2)) # ('hello', 'world', 80) <class 'tuple'>
使用zip()函数
list1[, , , ] list2[, , , ] new_list(list1, list2) (new_list, (new_list)) dic(new_list) (dic, (dic))
空元组的创建
yuanzu4() yuanzu5() (,yuanzu4,yuanzu5)
查询
元组是有序序列,可以通过索引号来访问元组中的元素
yuanzu (,,,) (yuanzu[])
in/not in 判断元素是否存在
yuanzu (,,,) ( yuanzu) ( yuanzu) ( yuanzu)
获取元组长度
len()方法
yuanzu (,,,) ((yuanzu))
合并元组
使用操作符 +
yuanzu1 (,,) yuanzu2 (,) yuanzu3 yuanzu1 yuanzu2 (yaunzu3)
删除元组
元组中的某个特定的元素无法删除,可以使用del关键字将整个元组对象删除
t (,,,) t (t)
遍历
元组属于可迭代对象,依然可以使用 for —in 循环
yuanzu ((, , )) item yuanzu: (item)
对象
注意事项:
a. 元组中存储的是对象的引用 ; 如果元组中对象本身是不可变对象,则不能再引用其他对象;如果元组中对象本身是可变对象,则可变对象的引用(id地址)不允许改变,但数据可以改变
如何理解呢?
我们知道不可变对象只允许查看,如果对其进行修改等操作会改变不可变对象的引用(id地址),假如元组中的不可变对象的引用改变了,那么元组的id地址也会发生变化;而可变对象在进行修改操作后的引用是不发生改变的,因此元组中对象如果是可变对象的话,对其进行修改不会改变元组的id地址。
我们可以举几个例子看一下
yuanzu(,,[,,]) (,yuanzu,(yuanzu),(yuanzu)) (yuanzu[],(yuanzu[]),(yuanzu[])) (yuanzu[],(yuanzu[]),(yuanzu[])) (yuanzu[],(yuanzu[]),(yuanzu[])) () yuanzu[] (yuanzu) () yuanzu[] (yuanzu) (,yuanzu[],(yuanzu[])) yuanzu[].() (,yuanzu[],(yuanzu[])) (,yuanzu,(yuanzu),(yuanzu))
但是当我们尝试去修改元组中的不可变序列(字符串)或者是直接修改引用列表元素的地址时,发现程序抛出 TypeError: 'tuple' object does not support item assignment 的错误
当然也可以将元组转换成列表,然后修改列表,再将修改的列表转换成元组,但要注意这样会产生一个新的元组。
t (,,,) (,t,(t),(t)) lst (t) (,lst,(lst)) lst[] t1 (lst) (,t1,(t1),(t1))
从元组的这一特点我们也可以看出:
在程序中要尽量使用不可变序列;因为一旦创建了不可变对象,对象内部的所有数据就都不能被修改,这样可以避免由于修改数据而导致的错误;所以对于不可变对象,在多任务环境下,同时操作对象的时候就不需要加锁。