变量存储相关
变量是存放在内存当中的
定义变量在运行时会在电脑内存中申请一块独立的内存空间
小整数池
1、在交互式模式下
Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被GC回收
每创建一个-5到256之间的整数,都是直接从这个池里直接拿走一个值,例如
>>> y=4
>>> id(y)
4297641184
>>>
>>> x=3
>>> x+=1
>>> id(x)
4297641184
在pycharm中
但在pycharm中运行python程序,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究
垃圾回收机制
1.引用计数:内存中的数据如果没有任何的变量名与其有绑定关系,那么会被自动回收
2.标记清除:当内存快要被某个应用程序占满的时候,会自动触发
3.分代回收:根据值得存活时间的不同,划为不同的等级,等级越高垃圾回收机制扫描的频率越低
个人理解:
现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐患。
类似最近2天看的Go语言,它的垃圾回收机制就位有无用的变量垃圾就直接会报错,并提示地点,所以垃圾回收机制是一个对于高级编程语言来讲减少很大工作量和一定程度上增加开发效率和工作效率的一个机制.
1绑定变量第一没有关系自然会被回收,
2变量会被标记,快满时候,python底层会操作删除多标记的无用垃圾
3青春代,中年代,老年代.大小自小到大,扫描时间由短到长,没扫描出来多了垃圾会自动传入下一个代
个人有个很酷的理解: 反向吃鸡
前面比较安全 但也会被击杀看成老年代状态
后期圈小,毒圈也很危险,死亡率高 看成青春代
中期前两个折中
对应分代回收的反向处境