第一部分:变量和值
在python中,变量和值有如下特点:
- 变量无类型
- 值有类型
见如下代码:
i=10
当声明变量i,并赋值10时,执行过程如下:
- 在内存中开辟空间,并分配 数字类型 10
- 在变量表中有变量i,指向10,这个“ 指向 ”也称之为“ 引用 ”
引用计数器:
python会通过“引用计数器”的方式记录10的引用次数,此时10的引用次数是1
第二部分:指向同一个对象
继续编码如下:
j=10
当声明变量j,并赋值10时,具体操作如下:
在变量表中有变量j,指向内存中 已经存在的10
注意:
不会 在内存开辟空间,并分配是10
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
代码如下:
id(i)
id(j)
id(10)
显示的地址是相同的
方法二:关键字is
关键字is,判断两个引用的地址是否相同
i is j
返回True,表示i和j引用的地址是相同的
第三部分:改变变量的值
继续编码如下:
i="鹿晗"
执行过程如下:
- 在内存中开辟空间,并分配“鹿晗”
- 变量i指向“鹿晗”
注意:
在python中变量没有类型,变量 i 可以指向数字,变量 i 也可以指向字符串
查看变量 i 的地址
再次通过id()函数查看变量 i 的地址,发现已经改变,因为变量 i 指向不同的内存地址
id(i)
引用计数器:
python会通过“引用计数器”的方式记录10的引用次数,此时10的引用次数是1
第四部分:不可变数据类型
想上面这种:当变量的值发生改变时,变量的引用指向 新的内存地址 ,这种就称之为 不可变数据类型
第五部分:垃圾回收
当10的引用次数是0时,会将该内存回收
第六部分:python交互环境
操作方式同上面的不一致,见如下代码
a=123
b=123
id(a)
id(b)
地址相同
见如下代码
a=10000
b=10000
id(a)
id(b)
地址不相同
字符串缓存
见如下代码
c='python测试字符串测试数据测试长字符串'
d='python测试字符串测试数据测试长字符串'
c is d
显示False,
跟上面所说的共享引用不同,原因如下:
- 0-255的值自动缓存
- 短字符串也可能被缓存
总结:
在python编程中,为了确保内存地址正确,尽量在py文件中编写代码,当不要求内存地址正确时,可在交互环境中编写代码



