2020-08-04

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后也是一样的.
  • 虽然它们两个的对象都是可以被销毁的,但是由于循环引用,导致垃圾回收器都不会回收它们,所以就会导致内存泄露.

未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。