1.dict的abc继承关系
dist类型实际上属于Mapping类型,dict继承关重写了一些方法
Mapping 属于抽象类,Mapping继承自 collection,我们看源码可以看到我们常用的一些方法的实现形式
我们要验证是否是属于mapping类,我们可以用 Isinstince进行验证
dict 常用的一些方法
- get
- clear 清空字典
- pop
- copy 浅拷贝,深层字典修改会对原字典中的深层字典产生影响
- keys
- values
- items
- deepcopy 深拷贝 ,深拷贝后对新的字典进行操作不会影响原字典
深拷贝要先引入一个类
import copy
a = {"key":{"addr“:"bjc"}}
b = a.deepcopy()
- fromkeys 不常用
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
-
setdefault 设置默认值,设置了就取设置的,没有就取默认的,并且只读取最后的值
a.setdefault('logic','csc')
将传的数据,前面的作为key,后面的作为值 -
update 新增加数据,可以是字典,和可迭代
三种方式: -
1 a.update({'a','b'})
-
2 可迭代的形式为 [('a','b')] 列表包括元组的形式
-
3 a.update(name='zc',age=19)
-
字典取值的说明
不建议用 a['value'] 这种直接取,如果此时取一个不存在的key程序会报错,建议用 a.get('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 中的方法:
- differnce 相当于集合中的差集
4.set 和dict实现原理
结论,dict查找效率要大于list
因为 dict只查找一次,原因是使用了 hash表,级别为 O(1), 也就是不管有多少数据,只查找一次
哈希参考资料:
https://blog.csdn.net/shouting3901/article/details/80468735
5.对象引用,可变性和垃圾回收
-
1 ==和is的区别
is是判断两个对象id值是否相等
== 是判断值是否相等
但是以上中有一个int类型是特殊的,因为有小整数对象池和大整数对象池,程序自动在创建相应的对象池 -
2 del语句和垃圾回收(GC)
其实垃圾回收就是统计对象的引用计数,当计数为0的时候,该对象就会被释放回收,但是循环引用的时候
参考资料:
https://blog.csdn.net/qq_37616069/article/details/79717704 -
3 经典的参数错误
Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变
的,列表、字典是可变的 -
不可变类型
以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的
int对象,i引用自这个新的对象。 -
可变类型
以list为例。list在append之后,还是指向同个内存地址,因为list是可变类型,可以在原处修改。
网友评论