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

    学习一门语言前,肯定是先学习这门语言的变量。要想深入了解这门语言,变量在内存中的管理尤其重要。

      Python中变量的定义和声明是很随意的,你可以在任何你想要开始使用变量的时候去定义吧,这和C有区别。而且声明变量的时候无需指定变量类型,它的类型会在变量赋值的时候由Python内部的解释器确定。注意,Python变量也需要遵循先创建赋值之后才可以使用的原则。

      作为一个优秀的程序,相信我们一定会仔细研究一门语言的变量在内存中是如何管理的,是否需要我们手动释放内存?很幸运的是,Python解释器已经帮我们解决了这个复杂的问题。那它是怎么做的什么时候回收那些对象呢?

      Python引入了一个机制:引用计数。引用计数的意思就是说Python内部记录了对象有多少个引用。

    引用计数增加情况

    比如下面的语句:

    x=4
    y=x

    变量x被创建赋值为4的时候,该对象的引用计数为1。当执行y=x语句的时候,变量y指向了跟变量x同一个对象,这时该对象的引用计数变成了2。

      总结一下对象会在一下情况下引用计数加1:

    1.对象被创建:x=4

    2.另外的别人被创建:y=x

    3.被作为参数传递给函数:foo(x)

    4.作为容器对象的一个元素:a=[1,x,'33']

    引用计数减少情况

    1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

    2.对象的别名被显式的销毁:del x  ;或者del y

    3.对象的一个别名被赋值给其他对象:x=789

    4.对象从一个窗口对象中移除:myList.remove(x)

    5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

    垃圾回收

    当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。

  • 相关阅读:
    位集合
    多线程进行http请求
    mysql--测试前缀索引能否用于order by 或者 group by
    用mysql触发器实现log记录
    源码安装mysql
    C语言:void指针
    C语言:枚举类型
    C语言:结构体与数组
    C语言:联合变量
    Linux 基础入门
  • 原文地址:https://www.cnblogs.com/codebean/p/2059879.html
Copyright © 2011-2022 走看看