垃圾回收机制
1.简介
当我们在命名变量时,系统会向内存申请一个空间来存放这个变量值。而内存的容量是有限的,当我们不再使用这个变量值时,那么占用着资源不做事它就成了'垃圾',此时python就为我们提供了垃圾回收机制专门清除这些白白占用内存的变量值。垃圾回收主要依靠引用计数机制为主,标记清除和分代回收为辅的策略。
2.引用计数
a = 18
b = a
变量值18被a关联,被b关联,那么它的引用计数为2。当一个变量值的引用计数为0,也就是没人用它了,那么这个变量值此时就成了‘垃圾’
3.标记清除
什么是循环引用:
l1 = ['jason', ]
l2 = ['kevin', ]
l1.append(l2)
l2.append(l1)
del l1
del l2
两个列表不被任何对象关联,本应该被回收,但它们之间互相引用使得他们的引用计数都不为0,钻了引用计数的空子。所以引出标记清除这个概念,专门用来解决引用计数的循环引用问题。
4.分代回收
新生代(每隔1分钟检查一次,类似于班里调皮捣蛋的学生)
青春代(每隔10分钟检查一次,类似于班里较为沉稳的中等学生)
老年代(每隔1小时检查一次,类似于班里让老师放心的好学生)
字符编码
字符编码简介
1.只有文本文件才有字符编码的概念
2.计算机内部存取数据采用的是二进制(0和1)
3.人类在于计算机交互时使用的都是人类语言,而计算机只认识0和1,因此我们需要通过字符编码来将人类使用的语言'翻译'成计算机语言。因此就有了编码的概念。
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中使用字符串需要在文件头加入一行
还要在字符串的前面加u(类似于格式化输出中f的用法)
2.python3默认使用utf8码