python变量与内存 作者:马育民 • 2018-06-28 22:25 • 阅读:10560 ## 第一部分:变量和值 在python中,变量和值有如下特点: 1. 变量无类型 2. 值有类型 见如下代码: ```python i=10 ``` 当声明变量i,并赋值10时,执行过程如下: 1. 在内存中开辟空间,并分配 **数字类型** 10 2. 在变量表中有变量i,指向10,这个“ **指向** ”也称之为“ **引用** ” 如下图: [](http://www.malaoshi.top//upload/0/0/1EF1PigL5gzT.png) #### 引用计数器: python会通过“引用计数器”的方式记录10的引用次数,此时10的引用次数是1 ## 第二部分:指向同一个对象 继续编码如下: ```python j=10 ``` 当声明变量j,并赋值10时,具体操作如下: 在变量表中有变量j,指向内存中 **已经存在的10** 注意: > **不会** 在内存开辟空间,并分配是10 如下图: [](http://www.malaoshi.top//upload/0/0/1EF1Pij0crXY.png) Python为了节省内存提高效率,当多个变量赋 **相同** 的值,且值是 **数字** 或 **字符串** 类型,那么变量的引用会指向 **同一个对象** 测试下面变量的地址是否相同: ``` f1=3.14 f2=3.14 print(id(f1)) print(id(f2)) ``` #### 引用计数器: python会通过“ **引用计数器** ”的方式记录10的 **引用次数**,此时“10”的引用次数是2 #### 证明变量 i 和 j 引用同一个地址 ##### 方法一:内置函数id(x) 用于获取对象的内存地址,更多解释参见连接: http://www.runoob.com/python/python-func-id.html 代码如下: ```python id(i) id(j) id(10) ``` 显示的地址是相同的 ##### 方法二:关键字is 关键字is,判断两个引用的地址是否相同 ```python i is j ``` 返回True,表示i和j引用的地址是相同的 ## 第三部分:改变变量的值 继续编码如下: ```python i="鹿晗" ``` 执行过程如下: 1. 在内存中开辟空间,并分配“鹿晗” 2. 变量i指向“鹿晗” 如下图: [](http://www.malaoshi.top//upload/0/0/1EF1Piy2v48f.png) **注意:** 在python中变量没有类型,变量 i 可以指向数字,变量 i 也可以指向字符串 #### 查看变量 i 的地址 再次通过id()函数查看变量 i 的地址,发现已经改变,因为变量 i 指向不同的内存地址 ``` id(i) ``` #### 引用计数器: python会通过“引用计数器”的方式记录10的引用次数,此时10的引用次数是1 ## 第四部分:不可变数据类型 想上面这种:当变量的值发生改变时,变量的引用指向 **新的内存地址** ,这种就称之为 **不可变数据类型** ## 第五部分:垃圾回收 当10的引用次数是0时,会将该内存回收 ## 第六部分:python交互环境 在python交互环境中,如下界面: [](http://www.malaoshi.top//upload/0/0/1EF28ovZ6fHy.png) 操作方式同上面的不一致,见如下代码 ```python a=123 b=123 id(a) id(b) ``` 地址相同 见如下代码 ```python a=10000 b=10000 id(a) id(b) ``` 地址不相同 #### 字符串缓存 见如下代码 ```python c='python测试字符串测试数据测试长字符串' d='python测试字符串测试数据测试长字符串' c is d ``` 显示False, 跟上面所说的共享引用不同,原因如下: 1. 0-255的值自动缓存 2. 短字符串也可能被缓存 **总结:** 在python编程中,为了确保内存地址正确,尽量在py文件中编写代码,当不要求内存地址正确时,可在交互环境中编写代码 原文出处:http://www.malaoshi.top/show_1EF1PjIIbogl.html