一.dict和list中copy方法画图加代码解释
dict浅拷贝
只拷贝了父目录(根目录)的数据,非容器类型数据本身拷贝的就是数据本身,容器类型(列表,元组,集合,字典)的数据拷贝的是容器的地址引用
dict_data1和dict_data2两者是独立的,但是里面的元素指向同一个,所以一个改变后,另一个也会随之而变
dict_data = {1: [1, 2, 3]} dict_data2 = dict_data.copy() print(dict_data2) print(id(dict_data[1])) print(id(dict_data2[1])) print(id(dict_data)) print(id(dict_data2)) dict_data[1][1] = 8 print(dict_data) print(dict_data2) 结果 {1: [1, 2, 3]} 2501838676224 2501838676224 2501837218560 2501837218752 {1: [1, 8, 3]} {1: [1, 8, 3]}
dict深拷贝
递归拷贝所有目录的数据,完全在另外内存中复制了一份原字典
图解:
list_data = [1, [2, 3]] list_data2 = copy.deepcopy(list_data) print(list_data2) print(id(list_data)) print(id(list_data2)) print(id(list_data2[0])) print(id(list_data2[0])) print(id(list_data[1])) print(id(list_data2[1])) list_data[1][0] = 8 print(list_data) print(list_data2) 结果 [1, [8, 3]] 1999515586368 1999515586112 1999508957488 1999508957488 1999515593024 1999515591232 [1, [8, 3]] [1, [2, 3]]
二.dict中扩展字典长度(多种方法)
第一种[key] = value
dict_data = {1: 2, 2: 3} dict_data[3] = 4 print(dict_data) 结果 {1: 2, 2: 3, 3: 4}
第二种setdefault
dict_data = {1: 1, 2: 2, 3: 4} dict_data.setdefault(4, 5) print(dict_data) 结果 {1: 1, 2: 2, 3: 4, 4: 5}
第三种update
dict_data = {1: 1, 2: 2, 3: 4} dict_data1 = {5: 6} dict_data.update(dict_data1) print(dict_data) 结果 {1: 1, 2: 2, 3: 4, 5: 6}
三.dict中获取所有的key,获取所有的value,获取所有的itemkey
dict_data = {1: 2, 2: 3, 3: 4} data = dict_data.keys() print(data) 结果 dict_keys([1, 2, 3]) values dict_data = {1: 1, 2: 2, 3: 4} data = dict_data.values() print(dict_data, data) 结果 {1: 1, 2: 2, 3: 4} dict_values([1, 2, 4]) items dict_data = {1: 1, 2: 2, 3: 3} data = dict_data.items() print(data) 结果 dict_items([(1, 1), (2, 2), (3, 3)])
四.dict中通过一个不存在的key去获取值(要求不报错)
setdefault # 如果键不在字典中,则插入值为默认值的键。 dict_data = {1: 1, 2: 2, 3: 4} data = dict_data.setdefault(4) print(data) 结果 None get # 如果 key 在字典中,则返回 key 的值,否则返回默认值。 dict_data = {1: 1, 2: 2} data = dict_data.get(3) print(data) 结果 None
五.定义空集合
data = set() print(data, type(data)) 结果 set() <class 'set'>
六.set中,求差集,求合集,求交集(要求在原集合上操作)
合集 set_data = {1, 3, 5, 6, 7} set_data1 = {1, 2, 3, 5, 6} set_data.update(set_data1) print(set_data) 结果 {1, 2, 3, 5, 6, 7} 交集 set_data = {1, 3, 5} set_data1 = {1, 2, 3, 4} set_data.intersection_update(set_data1) print(set_data) 结果 {1, 3} 差集 set_data = {1, 3, 5, 6, 7} set_data1 = {1, 2, 3, 5, 6} set_data.symmetric_difference_update(set_data1) print(set_data) 结果 {2, 7}
1.添加一个元素 add源码 add(self, *args, **kwargs): """ Add an element to a set. This has no effect if the element is already present. """ 将元素添加到集合中 set_data = {1, 3} set_data.add(2) print(set_data) 结果 {1, 2, 3} 2.删除一个元素(使用多种方法) pop源码 pop(self, *args, **kwargs): """ Remove and return an arbitrary set element. Raises KeyError if the set is empty. """ 删除并返回第一个元素 set_data = {1, 3, 4, 5, 6, 7} data = set_data.pop() print(data, set_data) 结果 1 {2, 3, 4, 5, 6, 7} remove 源码 remove(self, *args, **kwargs): """ Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError. """ 从集合中删除元素 set_data = {1, 3, 4, 5, 7, 8} set_data.remove(1) print(set_data) 结果 {3, 4, 5, 7, 8} discard 源码 discard(self, *args, **kwargs): """ Remove an element from a set if it is a member. If the element is not a member, do nothing. """ 如果元素是成员,则从集合中删除该元素 set_data = {1, 3, 5} set_data.discard(1) print(set_data) 结果 {3, 5} difference_update 源码 difference_update(self, *args, **kwargs): """ Remove all elements of another set from this set. """ 从此集中删除另一组的所有元素。 set_data = {1, 3, 5} set_data1 = {1} set_data.difference_update(set_data1) print(set_data) 结果 {3, 5} clear 源码 clear(self, *args, **kwargs): """ Remove all elements from this set. """ 从此集中删除所有元素 set_data = {1, 3} set_data.clear() print(set_data) 结果 set()