【开发基础】内存管理
内存管理
一、垃圾回收机制
1.引用计数
a.直接引用
变量名直指向变量值的内存地址。
b.间接引用
变量名通过间接的方式指向变量值的内存地址。
比如列表和字典,都是变量名先指向索引,然后通过索引指向变量值的内存地址。
c.引用计数增加:当一个变量值被多个变量名绑定,该变量值的引用计数增加。
d.引用计数减少:使用del x解除x与变量值的绑定关系。
a.垃圾:当在内存中存在占用内存空间的变量值,当变量值的引用计数为0时,称之为垃圾。
2.标记清除
当变量值没有没直接被引用的时候Python解释器会自动清除,但是解释器一直扫描内存的话会降低效率。
3.分代回收
分代:
1.分代指的是根据存活时间来为变量划分不同等级的。
2.在经历多次扫描后没有被回收的变量就会被gc机制认为这个变量是常用变量,gc对其扫描的评率就会降低
回收:
回收依然使用引用计数作为回收的依据。
4、总结
垃圾回收机制依然有缺点,依然会有小部分的垃圾不会被回收,但是相比一直对全体变量扫描代价较小。
二、与用户交互
1.接收用户输入
在Python3中,input会将用户输入的任意字符都存为字符串类型。
在Python2中,用户使用input输入什么类型的值就会保存成什么类型的值;raw_input这个功能在python2中和python3的input的功能一样。
2.格式化输出
a.:%号
格式的字符串(%s)与被格式化的字符串(传入的值)必须按照位置对应。(当使用字典传值的时候,使用%(key)s这种格式。使用字典传值可以打破位置的限制。)
ps:当需要格式化的字符串过多时位置就容易搞混。不推荐使用。
b.str.format
使用str.format需要用{}来接收值,能够按照索引、位置传值也能按照key=value传值。
ps:推荐使用str.format这种方法传值,兼容性好。
三、基本运算符
1.算数运算符
算术运算符就是指的常规的运算符,包括+(加),-(减),*(乘),/(除),//(取整除),%(取余),**(幂)。
2.赋值运算符
在python的语法中除了=号这个赋值运算外,还有增量赋值、链式赋值、交叉赋值、解压赋值四种赋值运算。
a.增量赋值
增量赋值的运算符有=(简单赋值)、+=(加法赋值)、-=(减法赋值)、*=(乘法赋值)、/=(除法赋值)、//=(取整除赋值)、%=(取余赋值)、**=(幂赋值)
b.链式赋值
链式赋值可以将一个值同时赋值给多个变量名,例如:
a=b=c=666
c.交叉赋值
定义两个变量,将两个变量的值互相交换,例如:
a=666 b=888 a,b=b,a
这样两个变量的值就交换了。
d.解压赋值
可以把列表中的多个值取出,然后依次赋给多个变量名,例如:
nums=[0,1,2,3]
a,b,c,d=nums
ps:使用解压赋值必须要让左边的变量名的个数和右边所包含值的个数一致。
3.比较运算符
比较运算用来对两个值进行比较,返回的是布尔值True或False。比较运算符包括==(等于),!=(不等于),>(大于),>=(大于等于),<(小于),<=(小于等于)。
4.逻辑运算符
逻辑运算符一般用于多个条件进行关联判断,会返回布尔值True或False。逻辑运算符包括and、or、not。
a.and(逻辑与)
可以用and连接多个条件,程序会按照从左到右的顺序去判断,所有结果都是True的情况下,最终的结果才会返回True;一旦其中一个为Flase则停止判断,最终结果为Flase。
b.or(逻辑或)
可以用or连接多个条件,程序会按照从左到右的顺序去判断,所有结果都是Flase的情况下,最终的结果才会返回Flase;一旦其中一个条件为True则停止判断,最终结果是True。
c.not(取反)
用来在程序中取相反的值。
d.优先级not>and>or
5.成员运算符
a.in
判断某个值是否被另一个值包含,判断完成后会返回布尔值True或Flase;字符串、列表、元组、字典、集合都可以用成员运算判断。
b.not in
判断某个值是否没有被另一个值包含、判断完成后会返回布尔值True或Flase。
6.身份运算符
a.is
is用来比较身份ID,两个身份ID相同会返回True,反之会返回Flase。
b.not is
not is用来比较两个身份ID是否不同,两个身份ID不同会返回True,反之会返回Flase。