本文转载自 Python中的字符串驻留机制 1. 字符串驻留机制(引用计数机制): 字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法。 系统维护interned字典,记录已被驻留的
本文转载自 Python中的字符串驻留机制
1. 字符串驻留机制(引用计数机制):
python的引用计数机制,并不是对所有的数字,字符串,它只对“ [0-9] [a-z] [A-Z]和"_"(下划线) ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的。
2. 驻留适用范围:
3. 实例
例子1:带下划线(_)
>>> str1='sten_waves' >>> str2='sten_waves' >>> str1 is str2 True >>> id(str1) 2072034398512 >>> id(str2) 2072034398512 例子2:带空格字符 >>> str3='sten waves' >>> str4='sten waves' >>> str3 is str4 False >>> id(str3) 2072034399920 >>> id(str4) 2072034399856 例子1与例子2可以看出,非数字、字符串、下划线(_)组成的字符串不会触发驻留。 驻留时机: python中的驻留发生在compile_time,而不是run_time。 >>> str1='sten'+'waves' # compile_time >>> str1 is 'stenwaves' True >>> str3='sten' >>> str4=str3+'waves' >>> str4 is 'stenwaves' # run_time False4.优缺点:
python标识符的不可变性导致了字符串的改动不是采用replace,而是重新创建对象。 为了节省内存,设计字符串的改动通常用join()而非+,因为+会多次创建对象,而join()只创建一次对象。驻留机制会提升一些时间和空间上的性能,但驻留对象也有所消耗。
注:
Pyhton提供intern方法强制2个字符串指向同一个对象 。
>>> import sys >>> a="a*&&" >>> b="a*&&" >>> a is b False >>> a=sys.intern(b) >>> a is b True在python中,整形对象存储的位置有所不同,有些整形是预先分配的,一致在内存里,而其他的则在使用时开辟空间。
对于[-5,256]之间的整数数字,Python默认驻留,即预先在内存中分配;