变量
变量(Variable)在计算机编程中于关联的标识符配对的内存存储位置,在使用时含相关类型的值,这个值可以修改。 这里的标识符就是变量的名字,变量名(相当于门牌号,指向值所在的空间,可以理解为指针的地址)。
在Python当变量被使用的时候,首先在内存里将会产生两个动作
第一:开辟一个指定地址的空间
第二:赋予指定的变量值
在Python语言中,变量在指定的同时,必须强制赋予初始值,否则解释器报错。
Python变量值类型
在所有编程语言中的变量值都是分类型的,Python语言的变量值的类型在赋值后才被隐性确定。例如A=0 那么0就是整数类型的值; A = “OK”,那么OK就是字符串类型的值,A = True,那么True则是Booleam类型的值。
Python语言的基本变量类型包括:字符串(String)、数字(Numeric)、列表(List)、字典(Dict)、元组(Tuple)五大类。
name = “yankerp” ## String price = 100 ## number names = [“yankerp”, “list”, “wangwu”] ## list name_data = {name1 : “yankerp”, name2 : “wangwu”} ## dict name = (“yankerp”, “zhangsan”) ## tuple
变量的定义规范
#1. 变量名只能是 字母、数字或下划线的任意组合 #2. 变量名的第一个字符不能是数字 #3. 关键字不能声明为变量名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
定义变量会有:id,type,value
1 等号比较的是value,
2 is比较的是id
强调:
1. id相同,意味着type和value必定相同
2. value相同type肯定相同,但id可能不同
小数据池的概念
Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被GC回收每创建一个-5到256之间的整数,都是直接从这个池里直接拿走一个值,
在pycharm中
但在pycharm中运行python程序,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
变量的垃圾回收机制
三、垃圾回收
下面所说的对象其实就是变量指针指向的值
当Python中的对象越来越多,占据越来越大的内存,系统会启动垃圾回收(garbage collection),将没用的对象清除。
不管何种语言,程序运行中都会耗费很多资源,如果有些应用完成以后,资源还不释放,运行性能就会越来越低,甚至发生OOM(out of memery)问题
无论何种垃圾收集机制, 一般都是两阶段: 垃圾检测和垃圾回收.
在Python中, 大多数对象的生命周期都是通过对象的引用计数来管理的.
问题: 但是存在循环引用的问题: a 引用 b, b 引用 a, 导致每一个对象的引用计数都不为0, 所占用的内存永远不会被回收
要解决循环引用: 必需引入其他垃圾收集技术来打破循环引用. Python中使用了标记-清除以及分代收集
即, Python 中垃圾回收机制: 引用计数(主要), 标记清除, 分代收集(辅助)
引用计数, 意味着必须在每次分配和释放内存的时候, 加入管理引用计数的动作
引用计数的优点: 最直观最简单, 实时性, 任何内存, 一旦没有指向它的引用, 就会立即被回收
Python中,主要依靠gc(garbage collector)模块的引用计数技术来进行垃圾回收。所谓引用计数,就是考虑到Python中变量的本质不是内存中一块存储数据的区域,而是对一块内存数据区域的引用。所以python可以给所有的对象(内存中的区域)维护一个引用计数的属性,在一个引用被创建或复制的时候,让python,把相关对象的引用计数+1;相反当引用被销毁的时候就把相关对象的引用计数-1。当对象的引用计数减到0时,自然就可以认为整个python中不会再有变量引用这个对象,所以就可以把这个对象所占据的内存空间释放出来了。
引用计数技术在每次引用创建和销毁时都要多做一些操作,这可能是一个小缺点,当创建和销毁很频繁的时候难免带来一些效率上的不足。但是其最大的好处就是实时性,其他语言当中,垃圾回收可能只能在一些固定的时间点上进行,比如当内存分配失败的时候进行垃圾回收,而引用计数技术可以动态地进行内存的管理。
1、原理
当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。比如某个新建对象,被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。
2、解析del
del a后,已经没有任何引用指向之前建立的[321,123],该表引用计数变为0,用户不可能通过任何方式接触或者动用这个对象,当垃圾回收启动时,Python扫描到这个引用计数为0的对象,就将它所占据的内存清空。
3、注意
1、垃圾回收时,Python不能进行其它的任务,频繁的垃圾回收将大大降低Python的工作效率;
2、Python只会在特定条件下,自动启动垃圾回收(垃圾对象少就没必要回收)
3、当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。
阈值分析:
700即是系统垃圾回收启动的阈值;
每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收;
当然也是可以手动启动垃圾回收:
4、何为分代回收
Python将所有的对象分为0,1,2三代;
所有的新建对象都是0代对象;
当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。