Python学习笔记--字典和集合
1.深拷贝和浅拷贝分析
(1)浅拷贝定义:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。
简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象
(2)深拷贝定义:
深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
例子:
#深浅拷贝 import copy a=["one","two","three",["four","five"]] b=a.copy()#浅拷贝 c=copy.deepcopy(a)#深拷贝 print(id(a)) print(id(b)) print(id(c)) a[0]="six" print("a此时的值:",a) print("b此时的值:",b) print("c此时的值:",c) print("------------") a[3][0]="seven" print("a此时的值:",a) print("b此时的值:",b) print("c此时的值:",c)
运行结果:
1944682628416 1944682628480 1944682810432 a此时的值: ['six', 'two', 'three', ['four', 'five']] b此时的值: ['one', 'two', 'three', ['four', 'five']] c此时的值: ['one', 'two', 'three', ['four', 'five']] ------------ a此时的值: ['six', 'two', 'three', ['seven', 'five']] b此时的值: ['one', 'two', 'three', ['seven', 'five']] c此时的值: ['one', 'two', 'three', ['four', 'five']]
2.收集参数打包方式:打包成元组和打包成字典
收集参数有两种打包方式,一种是打包成元组,一个星号(*),另一种打包成字典,两个星号表示(**)
#字典打包 def test(**params): print("有%d个参数" %len(params)) print("分别是:",params) test(a=1,b=2,c="xaiogou",d=True) print("------------------") dict1={"a":1,"bb":22,"cc":"enheng","dd":True} test(**dict1)
运行结果:
有4个参数 分别是: {'a': 1, 'b': 2, 'c': 'xaiogou', 'd': True} ------------------ 有4个参数 分别是: {'a': 1, 'bb': 22, 'cc': 'enheng', 'dd': True}
3.创建不可变集合
用frozenset()函数,将set冰冻起来,即不可变
#不可变集合 set1={1,2,3,4,5,6,7} set1.add(8) print(set1) print("----------") set2=frozenset(set1) print(set2) set2.add(10)
运行结果:
{1, 2, 3, 4, 5, 6, 7, 8}
----------
frozenset({1, 2, 3, 4, 5, 6, 7, 8})
Traceback (most recent call last):
File "d:\PythonWorkSpace\.vscode\test.py", line 216, in <module>
set2.add(10)
AttributeError: 'frozenset' object has no attribute 'add'
可以看出,试图添加时候,报错,说明集合不可变
# 集合中的元素必须是hashable类型, 即可以计算出哈希值
# hashable类型,如整数、浮点、字符串、元组等,而可变类型都不是hashable类型,
def test_set():
# 创建集合的字面量语法(重复元素不会出现在集合中)
set1 = {1, 2, 3, 3, 3, 2}
print(set1) # {1, 2, 3}
print(len(set1)) # 3
# 创建集合的构造器语法(后面会讲到什么是构造器)
set2 = set('hello')
print(set2) # {'o', 'e', 'h', 'l'}
# 将列表转换成集合(可以去掉列表中的重复元素)
set3 = set([1, 2, 3, 3, 2, 1])
print(set3) # {1, 2, 3}
# 创建集合的生成式语法(将列表生成式的[]换成{})
set4 = {num for num in range(1, 20) if num % 3 == 0 or num % 5 == 0}
print(set4) # {3, 5, 6, 9, 10, 12, 15, 18}
# 集合元素的循环遍历
for elem in set4:
print(elem)
# 集合的运算
def cal_set():
# 成员运算,通过成员运算in和not in检查元素是否在集合中
set1 = {11, 12, 13, 14, 15}
print(10 in set1) # False
print(15 in set1) # True
set2 = {'Python', 'Java', 'Go', 'Swift'}
print('Ruby' in set2) # False
print('Java' in set2) # True
# 交并差运算
set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {2, 4, 6, 8, 10}
# 交集
# 方法一: 使用 & 运算符
print(set1 & set2) # {2, 4, 6}
# 方法二: 使用intersection方法
print(set1.intersection(set2)) # {2, 4, 6}
# 并集
# 方法一: 使用 | 运算符
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8, 10}
# 方法二: 使用union方法
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8, 10}
# 差集
# 方法一: 使用 - 运算符
print(set1 - set2) # {1, 3, 5, 7}
# 方法二: 使用difference方法
print(set1.difference(set2)) # {1, 3, 5, 7}
# 对称差
# 方法一: 使用 ^ 运算符
print(set1 ^ set2) # {1, 3, 5, 7, 8, 10}
# 方法二: 使用symmetric_difference方法
print(set1.symmetric_difference(set2)) # {1, 3, 5, 7, 8, 10}
# 方法三: 对称差相当于两个集合的并集减去交集
print((set1 | set2) - (set1 & set2)) # {1, 3, 5, 7, 8, 10}
# 比较运算
set1 = {1, 3, 5}
set2 = {1, 2, 3, 4, 5}
set3 = set2
# <运算符表示真子集,<=运算符表示子集
print(set1 < set2, set1 <= set2) # True True
print(set2 < set3, set2 <= set3) # False True
# 通过issubset方法也能进行子集判断
print(set1.issubset(set2)) # True
# 反过来可以用issuperset或>运算符进行超集判断
print(set2.issuperset(set1)) # True
print(set2 > set1) # True
# 集合的常用方法
def set_method():
# 创建一个空集合
set1 = set()
# 通过add方法添加元素
set1.add(33)
set1.add(55)
set1.update({1, 10, 100, 1000})
print(set1) # {33, 1, 100, 55, 1000, 10}
# 通过discard方法删除指定元素 discard丢弃
set1.discard(100)
set1.discard(99)
print(set1) # {1, 10, 33, 55, 1000}
# 通过remove方法删除指定元素,建议先做成员运算再删除
# 否则元素如果不在集合中就会引发KeyError异常
if 10 in set1:
set1.remove(10)
print(set1) # {33, 1, 55, 1000}
# pop方法可以从集合中随机删除一个元素并返回该元素
print(set1.pop())
# clear方法可以清空整个集合
set1.clear()
print(set1) # set()
# 不可变集合
# 除了不能添加和删除元素,frozenset在其他方面跟set基本是一样的
def test_frozenset():
set1 = frozenset({1, 3, 5, 7})
set2 = frozenset(range(1, 6))
print(set1 & set2) # frozenset({1, 3, 5})
print(set1 | set2) # frozenset({1, 2, 3, 4, 5, 7})
print(set1 - set2) # frozenset({7})
print(set1 < set2) # False
print(set1.difference(set2)) # frozenset({7})

浙公网安备 33010602011771号