Python小整数对象池和字符串小整数对象池和字符串intern实例解析实例解析
主要介绍了Python小整数对象池和字符串intern实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者
工作具有一定的参考学习价值,需要的朋友可以参考下
is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同。
python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern技术。
整数和字符串是不可变对象,也就意味着可以用来共享,如100个“python”字串变量可以共享一个“python”字符串对象,而不
是创建100个“python”字符串。
小整数对象池小整数对象池
为了应对小整数的频繁使用,python使用对小整数进行了缓存,默认范围为[-5,256],在这个范围内的所有整数被python完全
地缓存,当有变量使用这些小整数时,增加对应小整数对象的引用即可。
>>> i = -5
>>> j = -5
>>> i is j # i和j是同一个对象
True
>>> i = 256
>>> j = 256
>>> i is j # i和j是同一个对象
True
>>> i = 257
>>> j = 257
>>> i is j # i和j是不同对象
False
由上面的实例可以看到,当变量在[-5,256]之间时,两个值相同的变量事实上会引用到同一个小整数对象上,也就是小整数对
象池中的对象,而不会去创建两个对象。而当变量超出了这个范围,两个值相同的变量也会各自创建整数对象,所以两者对应
的对象不同。
字符串字符串intern
如果当前变量引用的字符串对象已经存在的话,直接增加对应字符串对象的引用,而不去创建新的字符串对象,这就是字符串
intern机制。
>>> i = "12"
>>> j = "12"
>>> i is j
True
在详细探讨字符串intern机制之前,先看一个奇怪的问题:
>>> i = "1 2"
>>> j = "1 2"
>>> i is j
False
i = "1 2"
j = "1 2"
print(i is j)
输出结果
True
上述代码分开运行,结果为False,但是合在一起结果却为True,也就是说分开运行的时候,i,j指向不同对象,而合在一起的
时候i,j却指向了相同对象。为了明白其中的缘由,需要简单理解python的编译机制。
编译机制
在python中,万物皆对象,包括代码本身也是一种对象。python用code对象表示代码,代码编译后产生code对象。通常一个
作用域对应一个code对象。
i = "1 2"
j = "1 2"
print(i is j)
def f():
pass