zoukankan      html  css  js  c++  java
  • python 变量管理和内存管理

    python 变量管理和内存管理

    • 变量无需事先声明
    • 变量无需指定类型
    • 程序员不用关心内存管理
    • 变量名会被"回收"
    • del 语句能够直接释放资源

    变量定义

    • 大多数编译型语言,变量在使用前必须先声明,但在 python 中变量在第一次被赋值时自动声明。和其他大多是语言一样,变量只有被创建和赋值后才能被使用;
    • 变量一旦被赋值,就可以通过变量名来访问
    a = 'this is a'
    print(a)
    
    # =========print 输出结果=======
    # this is a
    

    动态类型

    • 需要注意一点: 在python中不但变量名无需事先声明,而且也无需类型声明。在python语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,python仍然是一种解释型语言。在创建————也是赋值时,解释器会根据语法右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的应用会被赋值给左侧的变量

    内存分配

    • 在为变量分配内存时,是在借用系统资源,在用完之后,应该释放借用的系统资源。python 解释器承担了内存管理的复杂任务

    引用计数

    • 要保持跟踪内存中的对象,python 使用了引用计数中的方法。也就是说 python 内部记录着所有使用中的对象各有多少引用。

    • 一个内部跟踪变量,称为一个计数器。每个对象各有多少个引用,简称引用计数

    • 当一个对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说这个对象的引用计数变为0,它就会被垃圾回收

    • 1、增加引用计数

      • 当对象被创建赋值给变量时,该对象的引用计数就被设置为1.
      • 当同一个对象又被赋值给其他变量时,或作为参数传递给函数、方法或类实例时,或者被赋值为一个容器对象的成员时,该对象的一个新的引用,或者称作别名,就会被创建(则该对象的引用计数自动+1)
      • 对象的引用计数增加时,如:
        • 对象被创建: x = 1
        • 另外一个别名被创建: y = x
        • 作为参数传递给函数: float(x)
        • 称为容器对象的一个元素: my_list = [1, 2, 3, x]
    • 2、减少引用计数

      • 当对象被销毁时,引用计数会减小。

      • 最明显的例子,当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用计数也就随之减少

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

        • foo = 'xyz'
        • bar = f00
        • bar = 123
        • 当字符串'xyz'被创建并赋值给 foo 时,它的引用计数是 1,;当增加一个别名 bar 时,引用计数变成了2;不过当 bar 被重新赋值给整型对象123后,xyz对象的引用计数自动减1,又重新变成1.
      • 其他造成引用计数减少的方式包括:

        • 一个本地引用离开了其作用范围;比如: 一个函数运行结束
        • del 语句删除一个变量;
        • 对象的一个别名被赋值给其他对象
        • 当一个变量被移出容对象时(或该容器对象本身的引用计数变成0时);
        • 容器对象本身被销毁

    垃圾收集

    • 不再使用的内存会被一种称为垃圾收集的机制释放。
    • 像上面说的,虽然解释器跟踪对象的引用计数,但是垃圾收集器负责释放内存。
    • 垃圾收集器是一块独立代码,它用来寻找引用计数为0的对象;也负责检查那些虽然引用计数不为0但也应该被销毁的对象。特定情形会导致循环引用
    • **循环引用: **当你至少有两个对象互相引用时,也就是说所有的引用都消失时,这些引用仍然存在
    • 这说明只靠引用计数是不够的,python 的垃圾收集器实际上是一个引用计数和一个循环垃圾收集器。当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其他对象。这种情况下,解释器会暂停下来,试图清理所有未引用的循环
  • 相关阅读:
    kettle结合MySQL生成保留最近6个月月度报告_20161009
    reduce用法
    【npm下载依赖包失败】gyp ERR! stack Error: EACCES: permission denied, mkdir问题解决方案
    【前端算法3】插入排序
    【前端算法2】快速排序
    【前端算法1】二分查找
    diy 滚动条 样式 ---- 核心代码
    [数据结构] 栈
    [数据结构] 列表
    day02 Python 运算符
  • 原文地址:https://www.cnblogs.com/gxfaxe/p/15196045.html
Copyright © 2011-2022 走看看