python高级编程第三讲:set、dict深入和垃圾回收

2019-07-21  本文已影响0人  小海怪的互联网

1.dict的abc继承关系

dist类型实际上属于Mapping类型,dict继承关重写了一些方法
Mapping 属于抽象类,Mapping继承自 collection,我们看源码可以看到我们常用的一些方法的实现形式
我们要验证是否是属于mapping类,我们可以用 Isinstince进行验证

dict 常用的一些方法

import copy
a = {"key":{"addr“:"bjc"}}
b = a.deepcopy() 
new_list = ['name','age']
new_dict = dict.fromkeys(new_list,{'zc',20})
print(new_dict)

执行结果:
{'name': {'zc', 20}, 'age': {'zc', 20}}
从上我们可以看出,fromkeys 是将我们所选的列表当作字典当中的key,将我们自己写的集合中的数据,当成是value,当我们不传入值的时候,其相应的key对应的值为 None

2.dict的子类

dict的子类:defaultdict
我们查看源码,可以发现很多方法的写法是
def _missing_(self,key,value:_KT) ->_VT:...
我们用一个就去来模拟一下
def demo(s:'dict') ->'': return s
如果将return s 换在 ...返回就是None

相当于就是
def demo(s):
return s

不建议继承list 和dict

先看一个例子:

class Demo(dict):
    def __setitem__(self, key, value):
        print(key,value)
        super().__setitem__(key,value*2)        
d = Demo({"one":1})
print(d)

执行结果:
{'one': 1} 此时我们通过初始化赋值的方式,程序并未执行setitem方法

class Demo(dict):
    def __setitem__(self, key, value):
        print(key,value)
        super().__setitem__(key,value*2)        
d = Demo({"one":1})
d["one"]= 1
print(d)

执行结果:
one 1
{'one': 2}
此时我们通过key修改赋值的时候才会执行setitem方法
有时候调用 ,有时候不调用 ,如果一定要用,我们要继承 UserDict

用UserDict实现(不常用 ):


from collections import UserDict
class Demo(UserDict):
    def __setitem__(self, key, value):
        print(key,value)
        super().__setitem__(key,value*2)
d = Demo({'one':1})
d['one']=1
print(d)

由结果我们可以看出这种方法不论是初始化还是通过key进行赋值都会执行 set item方法,这就是2种继承的不同之处,如果一定要继承dict的话,建议用 userdict

3.set 和frozenset

frozenset 不可变集合
set可以通过 add添加新元素,但是 frozenset没有add

frozenset 中的方法:

4.set 和dict实现原理

结论,dict查找效率要大于list
因为 dict只查找一次,原因是使用了 hash表,级别为 O(1), 也就是不管有多少数据,只查找一次
哈希参考资料:
https://blog.csdn.net/shouting3901/article/details/80468735

5.对象引用,可变性和垃圾回收

上一篇 下一篇

猜你喜欢

热点阅读