元组和列表很像,唯一差别是不可变性,可以作为字典的键
基础操作
#create
aTuple = (123, "abc", (45,6.7,'tuple'),['ds', 6.7, 89],None)
bTuple = (123,)
tuple('axvsaf')
#access
aTuple[1:4]
aTuple[1][2]
#update,虽然无法改变,但是通过构造另一个元组来完成修改功能
aTuple = aTuple[0], aTuple[1], aTuple[-1]
cTuple = aTuple + bTuple
del aTuple
操作符和内建函数
#create,*,+
t = ()
t * 2
t += ()
#成员关系
in
not in
#内建函数
len() max() min() str() cmp() list()
#操作符
==
<
>
#Notice:排序,替换,更新,添加等操作元组不支持,因为这些方法都和可变性有关,而元组是不可变的
元组的特殊特性
- 传递参数给其他组件API的时候,防止被修改,传入元组
- 通过list和tuple方法转换
- 字典的键
- 元组的+概念,可以修改扩充元组
- 元组内部可以有list,list是可以修改的,可以修改aTuple[0][1]这种
- 默认集合类型是元组,即没有[],也没有(),也没有{}的时候,默认是()元组
- 单一元素的元组要用’,’,因为()被重载了,用作分组操作符,即(‘xse’,)
- 所有函数返回的多对象(不包括有符号封装的),都是元组类型,建议显示使用(),或其他[]
def foo1():
pass
return obj1,obj2,obj3
def foo2():
pass
return [obj1,obj2,obj3]
def foo3():
pass
return {1:oj1,2:obj2,3:obj3}
深拷贝和浅拷贝
- 浅拷贝就是创建了一个新的对象和原对象一样,只是原对象的引用,以下操作默认是浅拷贝
- 完全切片操作[:]
- 利用工厂函数,list(),dic(),tuple()…
- copy.copy方法
- 深拷贝内存空间也复制了一份,copy.deepcopy()方法
- 非容器类型(数字,字符串,原子类型如代码、类型)没有copy的说法,因为浅拷贝是用完全切片来完成的的
- 如果元组中包括了原子类型,那么对它的深拷贝将不会进行
- 注意很有意思的是,字符串,数字那些不可变的类型,根本不存在深拷贝浅拷贝的说法,为什么呢,因为一旦改变,就是整体的改变,即重新建立新的对象,旧的就由垃圾回收机制配合引用计数自行销毁了
Reference
Python核心编程