课程学习笔记参考https://coding.imooc.com/class/200.html(__bobby前辈所讲)
dict的abc继承关系
from collections.abc import Mapping, MutableMapping
#dict属于mapping类型
a = {}
print (isinstance(a, MutableMapping))
dict的常用方法
def clear(self): # real signature unknown; restored from __doc__
""" D.clear() -> None. Remove all items from D. """
pass
def copy(self): # real signature unknown; restored from __doc__
""" D.copy() -> a shallow copy of D """
pass
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
@staticmethod # known case
def fromkeys(*args, **kwargs): # real signature unknown
""" Returns a new dict with keys from iterable and values equal to value. """
pass
def items(self): # real signature unknown; restored from __doc__
""" D.items() -> a set-like object providing a view on D's items """
pass
def keys(self): # real signature unknown; restored from __doc__
""" D.keys() -> a set-like object providing a view on D's keys """
pass
def setdefault(self, k, d=None): # real signature unknown; restored from __doc__
""" D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
pass
def update(self, E=None, **F): # known special case of dict.update
"""
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
"""
pass
dict的子类
from collections import UserDict
class Mydict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value*2)
my_dict = Mydict(one=1)
# my_dict["one"] = 1
print (my_dict)
from collections import defaultdict
my_dict = defaultdict(dict)
my_value = my_dict["bobby"]
pass
defaultdict接受一个工厂函数作为参数,如下来构造:
dict =defaultdict( factory_function)
factory_function can be list、set、str etc.if key is None, return default value,for exampple list->[],str->'',int->0
set frozenset(不可变,可以作为dict的key)
def __init__(self, seq=()): # known special case of set.__init__
"""
set() -> new empty set object
set(iterable) -> new set object
Build an unordered collection of unique elements.
# (copied from class doc)
"""
pass
dict 的实现原理
#dict查找的性能远远大于list #在list中随着list数据的增大 查找时间会增大 #在dict中查找元素不会随着dict的增大而增大 #1. dict的key或者set的值 都必须是可以hash的 #不可变对象 都是可hash的, str, fronzenset, tuple,自己实现的类 __hash__ #2. dict的内存花销大,但是查询速度快, 自定义的对象或者python内部的对象都是用dict包装的 # 3. dict的存储顺序和元素添加顺序有关 # 4. 添加数据有可能改变已有数据的顺序