set集合原理
-
set集合求差集是通过调用对象__hash__方法和__eq__方法(==运算)判断两个对象是否相同
-
set求差集时候使用的是初始化时候(元素添加到set集合的时候)计算出的hash值,即使初始化后修改了元素,也不影响求差集的结果
-
正常情况下list没有__hash__方法,也就是不可hash的(unhashable),自定义对象也一样。但我们可以在需要时自定义__hash__方法,这样就能获取到对象的hash值了
class my_list(list): # 自定义列表,继承list def __hash__(self): return hash(str(self)) def __eq__(self, other): return True if __name__ == '__main__': arr = [1, 2, 4] arr2 = [2, 3, 4] # s = {arr, arr2} # print(s) # 报错:TypeError: unhashable type: 'list'。因为构造set的时候需要元素的hash值,list没有hash方法 s = {my_list(arr), my_list(arr2)} print("s初始化后:", s) # 执行正常,my_list重写了__hash__方法,因此可以获取到hash值 s3 = {my_list([1, 2, 4])} print("s3", s3) print("s、s3求差集", s - s3) for item in s: # 遍历修改set中的列表元素,并修改 item.clear() item.append(1) print("s修改元素后:", s) s2 = {my_list([1])} print('s2', s2) s_s2 = s - s2 # set求差集时候使用的是初始化时候(元素添加到set集合的时候)计算出的hash值,即使初始化后修改了元素,也不影响求差集的结果 print("s、s2求差集", s_s2) print("s、s3求差集", s - s3)
执行结果:
s初始化后: {[2, 3, 4], [1, 2, 4]} s3 {[1, 2, 4]} s、s3求差集 {[2, 3, 4]} s2 {[1]} s、s2求差集 {[1], [1]} s、s3求差集 {[1]}