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,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其他对象。这种情况下,解释器会暂停下来,试图清理所有未引用的循环
原文地址:https://www.cnblogs.com/gxfaxe/p/15196045.html