垃圾回收机制与字符编码

160 阅读4分钟

垃圾回收机制

1.简介
    当我们在命名变量时,系统会向内存申请一个空间来存放这个变量值。而内存的容量是有限的,当我们不再使用这个变量值时,那么占用着资源不做事它就成了'垃圾',此时python就为我们提供了垃圾回收机制专门清除这些白白占用内存的变量值。垃圾回收主要依靠引用计数机制为主,标记清除和分代回收为辅的策略。
2.引用计数  #可以理解为变量值被各种变量名关联的次数
	a = 18
	b = a  
    变量值18被a关联,被b关联,那么它的引用计数为2。当一个变量值的引用计数为0,也就是没人用它了,那么这个变量值此时就成了‘垃圾’
3.标记清除  #是为了解决循环引用的问题。将程序中所有的变量值全部检查一遍,若发现有循环引用,则为其打上标记,之后一次性清除。
什么是循环引用:
    l1 = ['jason', ]
    l2 = ['kevin', ]
    l1.append(l2)  # 引用计数为2
    l2.append(l1)  # 引用计数为2
    del l1  # 解除变量名l1与列表的绑定关系 列表l1引用计数变为一
    del l2  # 解除变量名l1与列表的绑定关系 列表l2引用计数变为一
    两个列表不被任何对象关联,本应该被回收,但它们之间互相引用使得他们的引用计数都不为0,钻了引用计数的空子。所以引出标记清除这个概念,专门用来解决引用计数的循环引用问题。
4.分代回收  #标记清除每隔一段时间就会将所有的变量值检查一遍,一直工作资源消耗过大,分代回收机制是为了减轻标记清除的资源损耗。越往下,检查的频率越低。
新生代(每隔1分钟检查一次,类似于班里调皮捣蛋的学生)
青春代(每隔10分钟检查一次,类似于班里较为沉稳的中等学生)
老年代(每隔1小时检查一次,类似于班里让老师放心的好学生)

字符编码

字符编码简介

1.只有文本文件才有字符编码的概念
2.计算机内部存取数据采用的是二进制(01)
3.人类在于计算机交互时使用的都是人类语言,而计算机只认识01,因此我们需要通过字符编码来将人类使用的语言'翻译'成计算机语言。因此就有了编码的概念。
4.人类语言与计算机语言的对应关系不能随便更改,应该配一套统一的标准>>>字符编码表。

字符编码发展史

1.一家独大
    美国人在发明计算机时只考虑用让计算机识别英文字符。
    ASCII码:内部记录了英文字符与数字的对应关系。每个英文字母用1bytes来存储
2.群雄割据
    其他国家也需要计算机能够识别本国语言,因此各发明了一套本国的字符编码表。
    中国用的是GBK编码。2bytes起步来存储中文(每个汉字所占得字节数不一样,生僻字占用的更多)。英文仍然用1bytes存储。
3.天下一统
    万国码(unicode):对各国字符编码做的整合,所有的字符全部用起步2bytes来存储。
    utf家族:针对万国码进行优化的版本。最常用的是utf8。英文还是1bytes,其他统一3bytes起步。
    ps:内存使用nuicode  硬盘使用utf8

字符编码实操

"""只有字符串才可以参与编码和解码,其它数据类型需要先转换成字符串。"""
1.解决乱码的措施
    当初以什么编码存就以什么编码取
2.编码与解码
    编码(人类语言翻译成计算机语言)
    解码(计算机语言翻译成人类语言)
    s1 = 'hello world'
    编码:
        res = s1.encode('utf8')
        print(res,type(res))
    解码:
        res1 = res.decode('gbk')
        print(res1,type(res1))
3.解释器层面
	1.python2比unicode出现要早,因此它的默认编码是ASCII码。
    要想在python2中使用字符串需要在文件头加入一行# coding:utf8 
    还要在字符串的前面加u(类似于格式化输出中f的用法)
    2.python3默认使用utf8码