3.5.2 动态类型
Python中不但变量名无需事先声明,而且也无需类型声明。在Python语言中对象的类型和内存占用都是在运行时确定的。在创建时,也就是赋值时,解释器会根据语法和右侧的操作数决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。
3.5.3 内存分配
在变量分配内存时,是在借用系统内存,在用完之后,应该释放借用的系统资源。Python解释器承担了内存管理的复杂任务,这大大简化了应用程序的编写。
3.5.4 引用计数
Python内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量成为一个引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,它被垃圾回收。
1.增加引用计数
对象被创建
另外的别名被创建
被作为参数传递给函数
作为容器对象的一个元素
2.减少引用计数
一个本地引用离开了其作用范围
对象的别名被显示销毁
对象的一个别名被赋值给其他对象
对象被从一个窗口对象中移除
窗口对象本身被销毁
del 语句删除一个变量。 执行del x会删除该对象的最后一个引用,也就是该对象的引用计数会减少为0,这会导致该对象从此“无法访问”或“无法抵达”。从此刻起,该对象就成为垃圾回收机制的回收对象。任何追踪或调试程序会给一个对象增加一个额外的引用,这会推迟该对象被回收的时间。
3.5.5 垃圾回收
虽然解释器跟踪对象的引用计数,但垃圾收集器负责释放内存。垃圾收集器是一块独立的代码,它用来寻找引用计数为0的对象。它也负责检查那些虽然引用计数大于0但也应该被销毁的对象。Python的垃圾收集器实际上是一个引用计数和一个循环垃圾收集器。