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
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
frozenset 不可变集合 set可以通过 add添加新元素,但是 frozenset没有add
frozenset 中的方法:
结论,dict查找效率要大于list 因为 dict只查找一次,原因是使用了 hash表,级别为 O(1), 也就是不管有多少数据,只查找一次 哈希参考资料: https://blog.csdn.net/shouting3901/article/details/80468735