一、变量存哪了?

x = 10

当我们在p1.py中定义一个变量x = 10,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU、内存和硬盘。一定不是CPU,那是存放在内存还是硬盘中了呢?我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么x=10很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。

变量存放在内存中这句话太宽泛了,我们把它具体化。现在想象我们在学校(电脑内存)里上课,学校每开一个班,学校都会开辟一个教室给这个班级上课用(存放变量值10),而班级的门牌号则是(变量名x)。也就是说,对于电脑内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小空间,小空间内存放变量值10,然后内存给这个小空间一个变量名x(门牌号),x指向10。

二、Python垃圾回收机制

对于p1.py,如果我们再加上一段代码x = 11,大内存会开辟另一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x,所以大内存会解除x与10的连接,让x与11连接。这个时候10由于没有了门牌号,所以成为了python眼中的垃圾,python就会处理这个垃圾,释放10的内存占用,这就是python的垃圾回收机制。而其他语言需要手动把10的内存占用释放掉。

2.1 引用计数

从上述的解释我们可以知道只要某个变量值绑定着门牌号,就不是垃圾,反之变量值没有绑定着门牌号,这个变量值就是垃圾,python就会自动清理这个垃圾。这里我们对于这个门牌号给定一个专业的解释,在python中这个门牌号被称作引用计数。

x = 10  # 10引用计数加1为1
y = x # 10引用计数加1为2
x = 11 # 10引用计数减1为1;11引用计数加1为1
del y # 10引用计数减1为0,触发python垃圾回收机制,python清理10的内存占用

上述代码就是一个引用计数加减的过程。

三、小整数池

对于上一节讲的引用计数,需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。

在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。

最新文章

  1. 02-C#入门(枚举、结构等)
  2. Scala学习笔记一
  3. Windows下用Codeblocks建立一个最简单的DLL动态链接库
  4. hiho #1372:平方求 (bfs)
  5. COGS738 [网络流24题] 数字梯形(最小费用最大流)
  6. Linux Netcat 命令——网络工具中的瑞士军刀
  7. 努力学习 HTML5 (1)—— 初体验
  8. lua5.2版本在VS2010下的环境搭建
  9. poj 1949 Chores 最长路
  10. 安卓开发笔记——探索EventBus(转)
  11. Markdown 基础
  12. 【BZOJ5498】[十二省联考2019]皮配(动态规划)
  13. IDEA创建简单SpringBoot项目
  14. Java 定义静态list
  15. python 读取mysql数据至csv文件中,并发送邮件
  16. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
  17. Linux chmod +755和chmod +777 各是什么意思呢?
  18. CSS做一个Switch开关
  19. [Android教程] Cordova开发App入门(二)使用热更新插件
  20. 2017年第八届蓝桥杯【C++省赛B组】

热门文章

  1. 使用 Flutter 开发 Mac 桌面应用
  2. LeetCode刷题191121
  3. vim简单操作命令
  4. ORA-14061: 不能更改索引分区列的数据类型或长度
  5. 在 Cocos2d-x 中添加自己的微博链接
  6. Python通过pymysql连接数据库并进行查询和更新SQL方法封装
  7. 3万字长文概述:通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?
  8. JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程
  9. Vue小练习 03
  10. 判断上传的Excel为.xlsx还是.xls