前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python高级编程第三讲:set、dict深入和垃圾回收

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

作者头像
小海怪的互联网
发布2019-08-23 16:42:46
4870
发布2019-08-23 16:42:46
举报

1.dict的abc继承关系

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

dict 常用的一些方法

  • get
  • clear 清空字典
  • pop
  • copy 浅拷贝,深层字典修改会对原字典中的深层字典产生影响
  • keys
  • values
  • items
  • deepcopy 深拷贝 ,深拷贝后对新的字典进行操作不会影响原字典 深拷贝要先引入一个类
代码语言:javascript
复制
import copy
a = {"key":{"addr“:"bjc"}}
b = a.deepcopy() 
  • fromkeys 不常用
代码语言:javascript
复制
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

先看一个例子:

代码语言:javascript
复制
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方法

代码语言:javascript
复制
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实现(不常用 ):

代码语言:javascript
复制
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是可变类型,可以在原处修改。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.dict的abc继承关系
  • 2.dict的子类
  • 3.set 和frozenset
  • 4.set 和dict实现原理
  • 5.对象引用,可变性和垃圾回收
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档