Python基础
内存:
内存是计算机中重要的部件之一,它是外存与CPU之间进行沟通的桥梁。所有的数据都是储存在硬盘之中的,当CPU需要处理数据的时候,首先执行的是内存调用硬盘的内容,CPU处理的也是内存的数据。(即内存仅仅是临时存储)
变量地址和数据类型
变量地址:不同的变量被赋予相同的值时,虽然值一样,但是内存地址不同(各类语言皆是如此)
a=[123]
b=[123]
print(id(a),id(b))
运行结果:
于是,再敲一遍试试?
a=123
b=123
print(id(a),id(b))
运行结果:
WTF??
注:Python中如果是常用的值,可能会为了优化内存使用存储在同一位置,但是使用中和不同值的变量无区别 .
垃圾回收机制
python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略。
python里每一个东西都是对象,它们的核心就是一个结构体:PyObject
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
引用计数为0时,该对象生命就结束了.
导致引用计数 +1的情况 :
- 对象被创建,例如a=12
- 对象被引用,例如b=a
- 对象被作为参数,传入到一个函数中,例如func(a)
- 对象作为一个元素,存储在容器中,例如list1=[1,2,a]
导致引用计数 -1的情况 :
- 对象的别名被显式销毁,例如del a
- 对象的别名被赋予新的对象,例如a=24
- 一个对象离开它的作用域,例如:func函数执行完毕时,func函数中的局部变量(全局变量不会)
- 对象所在的容器被销毁,或从容器中删除对象
循环引用导致内存泄露 :
def f2():
'''循环引用'''
while True:
c1=A()
c2=A()
c1.t=c2
c2.t=c1
del c1
del c2
- 创建了c1,c2后,这两个对象的引用计数都是1,执行c1.t=c2和c2.t=c1后,引用计数变成2.
- 在del c1后,内存c1的对象的引用计数变为1,由于不是为0,所以c1的对象不会被销毁,同理,在del c2后也是一样的.
- 虽然它们两个的对象都是可以被销毁的,但是由于循环引用,导致垃圾回收器都不会回收它们,所以就会导致内存泄露.
未完待续