python变量与内存

第一部分:变量和值

在python中,变量和值有如下特点:

  1. 变量无类型
  2. 值有类型

见如下代码:

i=10

当声明变量i,并赋值10时,执行过程如下:

  1. 在内存中开辟空间,并分配 数字类型 10
  2. 在变量表中有变量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="鹿晗"

执行过程如下:

  1. 在内存中开辟空间,并分配“鹿晗”
  2. 变量i指向“鹿晗”

如下图:

注意:
在python中变量没有类型,变量 i 可以指向数字,变量 i 也可以指向字符串

查看变量 i 的地址

再次通过id()函数查看变量 i 的地址,发现已经改变,因为变量 i 指向不同的内存地址

id(i)

引用计数器:

python会通过“引用计数器”的方式记录10的引用次数,此时10的引用次数是1

第四部分:不可变数据类型

想上面这种:当变量的值发生改变时,变量的引用指向 新的内存地址 ,这种就称之为 不可变数据类型

第五部分:垃圾回收

当10的引用次数是0时,会将该内存回收

第六部分:python交互环境

在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,
跟上面所说的共享引用不同,原因如下:

  1. 0-255的值自动缓存
  2. 短字符串也可能被缓存

总结:
在python编程中,为了确保内存地址正确,尽量在py文件中编写代码,当不要求内存地址正确时,可在交互环境中编写代码


原文出处:/show_1EF1PjIIbogl.html