1. 垃圾回收机制详解
1. 1 引用计数
- 直接引用
# 先定义然后直接输出 x = 10 print(x)
- 间接引用
x = 10 l = ['aaa',x] print(l[1])
举一个简单的例子:
x = 10
l = ['a','b',x]
x = 123
print(l[2]) =====> 输出结果是:10
print(x) =====> 输出结果是:123
1.2 标记清除
- 循环引用
l1 = [111,] l2 = [222,] l1.append[l2] l2.append[l1] l1 = [ 值l1的地址,值l2的地址 ] l2 = [ 值l2的地址,值l1的地址 ] dl l1 dl l2
如果这时候清除 l1和 l2 ,就是把它们两个的直接引用清除了,但是间接引用没有被清除,所以说这个垃圾回收不了,这就会导致内存泄漏
-
内存泄漏的解决方式------->标记清除
内存中有三个存储区:栈区、堆区、其他区。
栈区:是用来存储一个变量的变量名
堆区:是用来存储一个变量的值
标记清除:它的工作原理是:先将扫描栈区里面的变量名将其清除,然后再扫描堆区里循环引用的间接引用的东西将其清除,它是Python解释器中自带的清楚机制。
3. 分代回收
分代回收意思就是,举个例子:一个班级有50换个学生,老师检查作业,第一次老师检查完有40个学生写了作业,第二次检查作业有35个人写了作业,第三次还是35个人写了作业;那么老师这时候就重点检查35个人之外的人,这样大大解决了老师的麻烦(根据存活时间来为变量划分不同的等级;新生代的变量,放到新生代这个等级中,假设每隔一分钟扫描新生代一次,结果发现这个变量依然被使用,那么这样会大大增加效率问题)
2.用户交互之接收用户输入
- 用户交互:对方给你给什么,你给对方反馈什么,这个就识别一个简单的交互吧
- 接收用户输入:
在python3中:
input会将用户输入的所有内容都存成字符串类型
user = input("请输入您的账号:")
print(user,type(user))
在python2中:
raw_input
input():要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
>>> x = input('')
>>> [1,2,3]
>>> x,type(x)
>>> ( [1,2,3], <type 'list'> )
3.格式化输出
-
%号输出
1.1 直接在%后面传值
res = '我的名字是%s 我的年龄是%s' %("zt","18")
print(res) =====> 输出结果是:我的名字是zt 我的年龄是18
1.2 用字典来传值
res = '我的名字是%()s 年龄是%()s' %{'name':'zt',
'age':'18'}
2. str.format 输出(python2.6版本发布的,兼容性好)
2.1 按照位置传值
res = 'my name is {} age is {}'.format('zt','18')
# 扩展
print('{x}==========='.format(x ="开始执行")) # 结果是:开始执行===========
print('{x:=<10}'.format(x="开始执行")) # 结果是:总共10个字符文字居左显示 (开始执行======)
print('{x:=^10}'.format(x ="开始执行")) # 结果是:总共10个=文字居中显示 (===开始执行===)
print('{salary:.3f}'.format(salary = 123.1235)) # 小数点保留三位数字
2.2 按照 key = value 来进行传值
res = '我的名字是 {name} 我的年龄是 {age}'.format(name='zt',age=18)
3. f 进行输出(python3.5版本发布的)
name = input('your name:')
age = input('your age:')
res = f 'my name is {name} age is {age}'
总结:
运行速率:f > format > %s (更建议用format,因为它的兼容还行非常的好)