1.元组
(1)元组不能为空,而且至少还要有1个逗号;当元组不是空元组时,括号可以省略,
但是my_tuple=, my_tuple=(,)都会报错
(2)元组的访问/提取类似列表,通用操作与列表相同
2.拆包
2.1元组的拆包:
a,b,c = (1,2,3),变量个数需与元素个数一一对应,否则会报错;如果不一致,可以在变量前面加*进行补足;
a,b,*c,d = (1,2,3,4,5,6,7),*表示补足变量,补足的变量位置得到列表
注意:语句中*只能出现一次
2.2列表的拆包:
my_list=[1,2,3], a,b = my_list,
注意:*补足同样适用,补足变量位置返回的也是列表
2.3字符串拆包:
my_str=‘i love china’,a,b,c = my_str
注意:*补足同样适用,补足变量位置返回的也是列表
3.字典
3.1字典的定义
(1)每一个键值对我们称其为一项(item)
(2)字典的键可以是任意的不可变对象(int str bool tuple…)
(3)字典的值可以是任意对象
(4)字典的键是不能重复的,如果出现重复的后面的会替换前面的
3.2字典的创建
(1)常规创建键值对
(2)dict()函数方式
dict()可以将一个含有双值子序列的序列转换为字典
双值序列:序列中有两个值,例如:[1,2],(‘a’,‘b’),‘ab’
子序列:如果序列中的元素也是序列,那么这个元素就是子序列[(1,2)]
含有双值子序列的序列:[(’name‘,’郭靖‘),(’name‘,'黄蓉’)]
(2.1)元组内变量赋值方式:
dict(name1=’郭靖‘,name2=‘黄蓉’)转换为{’name1‘=’郭靖‘,’name2‘:'黄蓉}
name1,name2表示变量,不能用引号括起来
(2.2)列表内元组对方式:
dict([(’name‘,’郭靖‘),(’name‘,'黄蓉’)])转换为{’name1‘=’郭靖‘,’name2‘:'黄蓉},注意:必须用括号括起来表示一对键值对,且元组内元素有且仅有2个
3.3字典的使用
(1)len()获取字典中键值对的个数
(2)in / not in检查字典中是否包含指定的键(注意:只能判断key而无法判断value或者key-value)
(3)dict[key]可以根据键获取字典当中的值,不能通过index来访问,因为默认都是键;如果key不存在会报错;
(4)get()方法:dict.get(key,default),通过key值拿到value,如果key值不存在,可以返回default值;如果不加入default,当key值不存在时返回None不会报错
(5)dict[key]=value重新赋值修改;如果key值不存在,则会直接在字典的最后位置添加新的键值对
(6)dict.setdefault(key,default):如果key已存在则返回字典中的value;如果key不存在则直接在字典的最后位置添加key-value,value=default,并返回default
(7)dict.update()将其他字典中的key-value添加到当前字典当中
dict1.update(dict2):更新的是dict1
(8)del dict[key] 删除字典当中的key-value (注意:字典中没有remove()方法)
(9)dict.popitem()随机删除一个键值对,一般都会删除最后一个,并将删除后的键值对作为返回值返回,返回的是一个元组,第一个元素是key,第二个元素是value
(10)dict.pop(key,default)根据key来删除键值对,如果key存在,则返回对应的value;如果key值不存在,则返回default
(11)dict.clear()清空字典
3.4浅拷贝&深拷贝
(1)赋值:相当于一个引用(指向相同的内存地址id),既不是深拷贝也不是浅拷贝
(2)浅拷贝&深拷贝,id()都不一样,用于序列嵌套(内层嵌套的序列与外层序列会有不同的内存地址)场景:
import copy
(3)浅拷贝:dict.copy(),copy.copy(dict)
只拷贝最外层的内存地址,内层的序列相当于直接引用(如下图:内存地址一样),修改内层序列时相当于直接修改了引用,因此内层序列会同时变化
(4)深拷贝:copy.deepcopy(dict)
拷贝到最内层的地址(如下图:内存地址不同),修改内层序列时只会修改拷贝后的id位置,因此原内层序列不会同时变化