python内存管理 变量无需事先声明_【python笔记】__内存管理

Python的内存管理

变量无需事先声明

变量无需指定类型

程序员不用关心内存管理

变量名会被回收

del语句能够直接释放资源

变量定义

在Python中,无需变量声明语句,变量在第一次被赋值时自动声明。变量只有被创建和赋值后才能被使用。

变量一旦被赋值,就可以通过变量名来访问它。

动态类型

在Python中,不但变量名无需事先声明,而且也无需类型声明。对象地类型和内存占用都是运行时确定的。

在创建——也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象地应用会被赋值给左侧的变量。

内存分配

Python解释器承担了内存管理的复杂任务,大大简化了应用程序的编写。

引用计数

Python内部记录着所以使用中的对象各有多少引用。至于每个对象各有多少个引用,简称为引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。

增加引用计数

当对象被创建并(将其引用)赋值给变量时,该对象地引用计数就被设置为1。

当同一个对象(的引用)又被赋值给其它变量时,或作为参数传递给函数,方法或类实例时,或者被赋值为一个窗口对象的成员时,该对象的一个新的引用,或者称作别名,就被创建(则该对象的引用计数自动加1)。总之,对象的引用计数在

对象被创建

x = 1

或另外的别名被创建

y = x

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

foo(x)

或成为容器对象的一个元素

List = [123 , x , 'abc]

减少引用计数

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

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

a = 'abc'

b = a

a = 123

当abc被创建并赋值给a,它的引用计数为1,增加了一个别名b时,引用计数变成了2。a又被重新赋值给整数对象123时,abc对象的引用计数自动减1,又重新变成了1。

del语句删除变量等也会造成对象的引用计数减少,总结一下,一个对象的引用计数在以下情况会减少:

一个本地引用离开了其作用范围。比如函数运行结束时。

对象地别名被显式地销毁。

del y

对象的别名被赋值给其他的对象

上面例子的 a = 123

对象被从一个窗口对象中移除

myList.remove(x)

窗口对象本身被销毁

del myList

del 语句

del语句会删除对象的一个引用

上例中del y 会产生两个结果:

从现在的名字空间中删除 y

x 的引用计数减1

执行del x 会删除该对象的最后一个引用,也就是该对象的引用计数会减为0,这会导致该对象从此无法访问或无法到达。从此刻起,该对象就成为垃圾回收机制的回收对象。注意任何追踪或调试程序会给一个对象增加一个额外的引用,这会推迟该对象被回收的时间。

垃圾收集

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

一个循环引用发生在当你有至少两个对象互相引用时,也就是说所有的应用都消失时,这些应用仍然存在,这说明只靠引用计数是不够的。Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其他对象。作为引用计数的补充,垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。在这种情况下,解释器会暂停下来,试图清理所有未引用的循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值