内置函数id
Python语言中的变量都有自己的id,这是一个唯一的标识符,是一个整数。在CPython类型解释器中(我们用的解释器就属于CPython解释器),这个整数是对象的内存地址。
x = 1
print(id(x))
x = 2
print(id(x))
运行结果为:
1704750560
1704750592
代码分析:通过id函数获取了变量x的标识符(即x对应的内存地址),当x的值改变之后,标识符也发生了变化。
z = y = x = 10
print(id(x))
print(id(y))
print(id(z))
c = b = a = 10000
print(id(a))
print(id(b))
print(id(c))
运行结果为:
1704750848
1704750848
1704750848
2807393913456
2807393913456
2807393913456
代码分析:赋值相同的变量,标识符相同,也就是它们共用一块内存。这种机制和其他计算机语言(如C语言)有明显差异。
小整数池
上面我们看到的运行结果是在Pycharm中Run窗口中的内容。下面在Pycharm中的Python Console界面再次进行测试(这样使用的是原装的python解释器。也可以用启用命令提示符,即cmd,调用python解释器进行测试)
可见,对于b = a = 256,a和b的id值是相同的;但对于 d = c = 257,两者的id值就不同了。这种奇怪的现象涉及到了小整数池。
Python解释器为了优化速度,使用了小整数池, 避免为整数频繁申请和销毁内存空间。小整数池的范围是 [-5, 256]。 这些整数对象是提前建立好的,不会被回收。在一个 Python 的程序中,在小整数池范围内,无论相同整数处于什么位置,使用的都是同一个对象。同理,单个字母也是这样的。
而Pycharm在Python解释器的基础上进行了进一步优化(当然是以耗费更多内存为代价),将小整数池范围扩大了,不过初级开发者没有必要关注这些。