#coding:utf-8 # 内存:操作系统的运行内存,运行内存一般用于启动一些程序,开启一些进程和线程供程序 调度使用。 # 1>自动管理内存,比如OC,Python # 2>手动管理内存,比如C # Python中的内存管理采用的是“引用计数”的方式,对一个对象的生命周期进行管理。如果 一个对象的引用计数为0,则该对象会被解释器进行内存的回收,对象也随之消失。如果一个对象 的引用计数不为0,则该对象会一直存放在内存中。 # 手动管理内存,指的是由程序员负责对象的内存释放: # 优势:对象的引用计数管理更加精准,不容易产生内存泄漏的现象,(内存泄漏就是对象没有被 释放,依然在内存中存在。)。 # 缺点:消耗大量时间。 # 自动管理内存: # 优势:开发效率更高。 # 缺点:可能会产生对象在内存中释放不掉的情况,出现内存泄漏。 # 关于内存分区: # 1>栈区 栈区内存一般用于保存局部变量,指针等,该区的内存由操作系统在程序运行结束时 负责回收; # 2>堆区 创建的对象(list/tuple/dict/object)存储在堆区,程序员的主要管理区就是 堆区的内存。 # list1 = [1,2,3] # list1 = [1,2,3] # 3>全局区或者静态区,用于存放全局变量,全局变量占用的内存需等到整个程序运行结束时, 才能被回收。也是由操作系统进行回收的。不受引用计数的限制。 # 4>常量区,用于存放一些字符串,整数,小数等常量,而常量所占用的内存是可以共享的, 目的是节省内存空间。不受引用计数的限制,由操作系统统一回收常量区内存。 # a = 1 # b = 1 # c = 1 # 5>代码编译区,用于存放经过解释器编译过后的二进制代码文件。由操作系统在程序运行结束后 进行统一回收。 # 对象的引用计数变化: # 1>当对象被创建时,引用计数+1; # 2>当对象被其它指针或变量引用时,引用计数+1; # 3>当对象被删除时,引用计数-1; # 4>当程序执行结束,引用计数为0; class People(object): def __init__(self): print 'People对象被创建了' def __del__(self): print 'People对象被释放(内存中删除对象)时会执行__del__' p1 = People() # +1 p2 = p1 # +1 del p2 # -1 # string = input('输入数据:') # print 'string = ',string del p1 # -1 print p1 string = input('输入数据:') # 对象的深浅拷贝