day15_字典、元组、集合、深浅拷贝

字典

定义

key:value的格式,在{}内以逗号隔开,存放多个元素

key :不可变数据类型

value :任意数据类型

dic = dict()  # 定义空字典
dic = {}  # 定义空字典
dic = {'name':'alex','age':18,'hobby_list':['music','dapao']}  # 定义字典

常用方法

dic[key]  # 按key获取value值,若无该key,程序报错
dic[key] = value  # 字典中有这个key,修改对应的value值,若字典中没有这个key,则添加这个键值对
len(dic)  # 求字典长度(包含键值对个数)
del dic[key]  # 按key删除删除键值对
print(x in dic)  # 成员运算
for key in dic  # 遍历字典的key
for key in dic.keys()  # 遍历字典中的key
for value in dic.values() # 遍历字典的value
for item in dic.items()  # 遍历字典的键值对,item取值后以元组存储
for key,value indic.items()  # 等于对上一个item的解压缩

内置方法

dic.keys()  # 
dic.values()  #
dic.items()  #
dic.pop(key)  # 按key弹出一个键值对元素,返回值是对应的vlaue
dic.popitem()  # 随机弹出一个键值对,以元组返回(key,value)
dic[key]  # 按key获取value值,若无该key,程序报错
dic.get(key)  # 按key获取value值,若无该key,程序不会报错
dic[key] = value  # 字典中有这个key,修改对应的value值,若字典中没有这个key,则添加这个键值对
dic.update(**kwargs)  # 字典中有关键字实参名的key,就更新对应的vlaue,没有就添加键值对
dic.copy()  # 复制后的dic,值的修改不会影响原来的dic
dic.setdefault(key,value)  # 字典中有这个key,就不修改,字典中没有这个key就添加这个键值对
dic.fromkeys([key1,key2,key3,...],value)  # 新建字典,默认值都为value,key用列表,元组,等可迭代对象传入
dic.clear()  # 清空字典

可变/不可哈希

dic = {'name':'nick'}
print(dic,id(dic))
dic['age'] = 18
print(dic,id(dic))
'''
{'name': 'nick'} 2366442570200
{'name': 'nick', 'age': 18} 2366442570200
'''

元组

定义

()内以逗号隔开,存储多个元素,当为一个元素时,需加上逗号,与运算优先级()进行区分

除了不可变,与列表相同

tup = tuple()  # 定义空元组
tup = ()  # 定义空元组
tup = ('a','b',2,5,[1,2,3])  # 可以存储可变元素,但是tup本身不可变

常用方法

除了不可变,与列表相同

不可变/可哈希

tup = (1,2)
print(tup,id(tup))
tup = (1,2,4)
print(tup,id(tup))
'''
(1, 2) 1841682939080
(1, 2, 4) 1841685233560
'''

集合

定义

{}内以逗号分隔,存储多个不可变元素

重复的值,只取第一个

无序

s = set()  # 定义空集合,只能使用这个方式定义空集合
s = {'a','b',1,3,2}
print(s)

常用方法

|  # 并集
&  # 交集
-  # 差集
^  # 交叉补集

内置方法

s.remove(element)  # 删除不可变元素,当删除的元素不存在,程序报错,返回值为None
s.discard(element)  # 删除不可变元素,当删除的元素不存在,程序不报错,不管存不存在,都返回None
s.add(element)  # 添加不可变元素
s.pop()
s.clear()
s.copy()
s.update(s)

可变/不可哈希

s = {'a','b',1,3,2,4}
print(s,id(s))
s.add(5)
print(s,id(s))
'''
{1, 2, 3, 4, 'b', 'a'} 1845526130248
{1, 2, 3, 4, 5, 'b', 'a'} 1845526130248
'''

深浅拷贝

针对可变数据类型而言

当变量为可变数据类型,变量值的改变,不会改变内存地址

拷贝

只添加对变量的引用

当通过变量的任意一个引用改变变量值,该值的所有引用的值同样会改变,因为内存地址没变

lt = [1,2]
lt1 = lt
print(lt,lt1,id(lt),id(lt1))
lt.append(3)
print(lt,lt1,id(lt),id(lt1))
'''
[1, 2] [1, 2] 2909969404488 2909969404488
[1, 2, 3] [1, 2, 3] 2909969404488 2909969404488
'''

浅拷贝

复制拷贝对象中的不可变元素,存储到新的内存空间,同时对拷贝对象中的可变元素添加引用

当拷贝对象或者拷贝得到的对象中的不可变元素发生变化,不会对另一个产生影响,当拷贝对象或者被拷贝对象中的可变元素发生变化,另一个的可变元素也会发生同步变化

import copy

lt = [1,3,[2,4]]
print(lt,id(lt),id(lt[2]))
lt1 = copy.copy(lt)
print(lt1,id(lt1),id(lt1[2]))
lt.append(5)
print(lt,id(lt),id(lt[2]))
print(lt1,id(lt1),id(lt1[2]))
lt1[2].append(6)
print(lt,id(lt),id(lt[2]))
print(lt1,id(lt1),id(lt1[2]))
'''
[1, 3, [2, 4]] 2696187565128 2696187564616
[1, 3, [2, 4]] 2696337515208 2696187564616
[1, 3, [2, 4], 5] 2696187565128 2696187564616
[1, 3, [2, 4]] 2696337515208 2696187564616
[1, 3, [2, 4, 6], 5] 2696187565128 2696187564616
[1, 3, [2, 4, 6]] 2696337515208 2696187564616'''

深拷贝

复制拷贝对象中元素,存储到新的内存空间

当拷贝对象或者拷贝得到的对象中的元素发生变化,另一个不会发生变化

import copy

lt = [1,3,[2,4]]
print(lt,id(lt),id(lt[2]))
lt1 = copy.deepcopy(lt)
print(lt1,id(lt1),id(lt1[2]))
lt.append(5)
print(lt,id(lt),id(lt[2]))
print(lt1,id(lt1),id(lt1[2]))
lt1[2].append(6)
print(lt,id(lt),id(lt[2]))
print(lt1,id(lt1),id(lt1[2]))
'''
[1, 3, [2, 4]] 2239576364040 2239576363528
[1, 3, [2, 4]] 2239697964488 2239577634248
[1, 3, [2, 4], 5] 2239576364040 2239576363528
[1, 3, [2, 4]] 2239697964488 2239577634248
[1, 3, [2, 4], 5] 2239576364040 2239576363528
[1, 3, [2, 4, 6]] 2239697964488 2239577634248
'''
posted @ 2019-09-16 20:49  W文敏W  阅读(142)  评论(0)    收藏  举报