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

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是可变类型,可以在原处修
    改。

猜你喜欢

转载自blog.csdn.net/scyllake/article/details/96702133
今日推荐