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

    python内部使用引用计数,来保持追踪内存中的对象,python内部记录着所有使用中的对象各多少引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。

    引用计数增加的情况:

    1.对象被创建,即将一个对象赋给一个变量时(变量实际就是对象的一个名字,右边的是一个对象)

    x=3.14

    2.或另外的别名被创建

    y=x

    3.作为参数传递给函数(新的本地引用)

    foo(x)

    4.成为容器对象的一个元素

    lst=[12,"x",x]

    引用计数减少的情况:

    1。当变量被赋值给另外一个对象,原对象的引用计数也会自动减1

    foo="as"

    bar=foo

    foo=123

    2.一个本地引用离开了其作用范围,如foo(x)函数结束

    3.对象的一个别名被赋值给其它的对象

    4.对象的别名被显式的销毁 del y

    5.对象被从一个窗口对象中移除 lst.remove(x)

    6.窗口对象本被销毁 del lst

    x=1

    y=x

    (del 从现在的名字空间中删除y,x的引用计数减1)

    不会被使用的内存会被垃圾收集机制释放掉

    垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)

    python中实现内存泄露的技术

    class A(object):

      def __init__(self):

        print "%S born" % id(self)

      def __del__(self):

        print "delete %s" % id(self)

    class B(object):

      def __init__(self):

        print "%S born" % id(self)

      def __del__(self):

        print "delete %s" % id(self)

    a=A()

    b=B()

    a.B=b

    b.A=a

    del a

    del b

  • 相关阅读:
    zyb的面试
    Codeforces Round #514 (Div. 2)
    Maximum GCD(fgets读入)
    Harmonic Number(调和级数+欧拉常数)
    Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
    Sigma Function (平方数与平方数*2的约数和是奇数)
    Leading and Trailing (数论)
    【贪心】【CF3D】 Least Cost Bracket Sequence
    【套题】qbxt国庆刷题班D1
    【极值问题】【CF1063B】 Labyrinth
  • 原文地址:https://www.cnblogs.com/aveenzhou/p/2676179.html
Copyright © 2011-2022 走看看