zoukankan      html  css  js  c++  java
  • python中的内存管理

    不像大多数编译型语言,变量必须在使用之前声明名字和类型,在python中,变量在第一次被赋值时自动声明。在变量创建时,python解释器会根据语法和右侧的操作数来决定新对象的类型,在对象创建后,一个该对象的引用会被赋值给左侧的变量。对于内存管理的任务,由python解释器操作。

    引用计数

    python采用引用计数的技术来记录所有使用中的对象各有多少引用,当一个对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。

    1.引用计数增加的情况

    a = 1

    b = a

    赋值并不是直接将一个值赋给一个变量,在python中,对象时通过引用传递的。在赋值时,不管这个对象是被新创建的,还是一个已经存在的,都是将该对象的引用(而不是值)赋值给变量。也就是说a,b两个变量名指向同一个对象,通过 id() 可以确定。

    可以看到a,b指向同一个地址。对象被创建并赋值给变量时,该对象的引用计数被设置为1。当同一个对象的引用增加时引用计数会随着增加1,我们通过使用sys包中的getrefcount()函数来查看某个对象的引用计数,(调用getrefcount()时对象回创建一个新的引用,所以返回的值应该比原有的多1)。

    对象引用计数增加的情况:

    •   对象被创建:x = 1
    •   对象另外的别名被创建:y = x
    •   被作为参数传递给函数(新的本地引用):func(x)
    •   成为容器对象的一个元素:l = [1,2,x]

    2、引用计数减少的情况

    当对象的引用被销毁时,它的引用计数会自动减1;

    •   一个本地引用离开了起作用范围。比如函数结束时  
    •   对象的别名被显式销毁:del x 
    •   对象的一个别名被赋值给其他对象:x = 123  
    •   对象被从一个容器对象中移除:l.remove(x)  
    •   容器本身被销毁:del l

    垃圾收集

    不再使用的内存会被一种成为垃圾收集的机制释放。解释器跟踪对象的引用计数,垃圾收集器负责释放内存。垃圾收集器是一块独立代码,它用来寻找计数为0的对象,但也负责检查那些引用计数大于0但应该被销毁的对象。特定情形会导致循环引用。

    python垃圾处理机制仅靠引用计数和垃圾收集器是不够的,真正的要复杂的多,学了再更新。

  • 相关阅读:
    python 快速排序详述
    GitHub 小试牛刀(踩坑记录)
    python 内部类
    Django1.11搭建一个简易上传显示图片的后台
    Ubuntu16.04卸载opencv2.4.9并安装opencv3.2.0+contrib
    OpenCV4Android背景建模(MOG、MOG2)
    CentOS7.3安装NVIDIA-1080ti驱动、cuda、cudnn、TensorFlow
    TensorFlow Object Detection API(Windows下测试)
    关于git常见的一些问题
    聊聊Java中的反射(一)
  • 原文地址:https://www.cnblogs.com/mzct123/p/6027770.html
Copyright © 2011-2022 走看看