C#中的字符串驻留
熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝。如果仅在运行期间值才相同的字符串变量,.NET不会为这个2个相同的字符串变量指向同一份引用的。不过.NET提供了一个方法,让开发人员可以强制将两个相同的字符串指向同一个引用,使用String类中的Intern方法。string s1 = "!QAZ2wsx3$%5$$%fe _ ###4@";
string s2 = "!QAZ2wsx3$%5$$%fe _ ###4@";
Console.WriteLine("s1,s2是否引用同一对象:" + object.ReferenceEquals(s1, s2));
string s3 = "bbbbb";
string s4 = string.Concat("bbb", "bbb");
Console.WriteLine("s3,s4是否引用同一对象:" + object.ReferenceEquals(s3, s4));
Console.WriteLine("调用Intern后..." );
s3 = String.Intern(s4);
Console.WriteLine("s3,s4是否引用同一对象:" + object.ReferenceEquals(s3, s4));如下演示代码:这样设计的合理性是因为string类型在C#中是属于immutable的,即对string的修改,并不是在原来的内存块上修改,而是重新开辟一块新的空间,创建新的对象。
Python的String同样也有驻留
Python中,同样为immutable的String类型,也采用了这种字符串驻留机制。但Python中稍微有点小规则。
1,长度为0和1的字符串,默认都采用了驻留机制。
>>> a=""
>>> b=""
>>> a is b
True
>>> a="a"
>>> b="b"
>>> a is b
False
>>> a="!"
>>> b="!"
>>> a is b2.编译期间就确定了的字符串,也采用驻留机制,但是,仅限于以下这些字符:
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
先解释一下什么叫做编译期间,Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件,之后再由Python虚拟机运行。这一点,和.Net的Framework、Java虚拟机很类似。(更多相关内容可以参考《Learning Python》),因此有些代码会在翻译成字节码的时候,就自动的帮程序员预先计算了。我们可以通过dis方法(分解Python中的字节码 )来验证,可以通过python -m dis xxx.py这样的命令来查看
举例:如下的一个Python文件test.pya="abcdef"
b="abc"+"def"
c="".join(["abc","def"])
print (a,b,c)
print ("a and b are same?",a is b)
print ("a and c are same?",a is c)运行:可以看到,变量a和b是同一个引用,但是a和c就不是了。再看其字节码,可以看出,a和b在赋值的时候,就是相同的字符串,但是c就不同了,它是几个字符串的拼装,它是在运行期间才知道结果。
注意,必须是字符串必须是在"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"中,不然就不支持字符串驻留。
比如:
>>> a="abcdef!"
>>> b="abcdef!"
>>> a is b
False3.通过乘法运算符得到的字符串,长度必须小于20。不然也无驻留机制
>>> a="abc"*6 #长度18
>>> b="abc"*6 #长度18
>>> a,b
("abcabcabcabcabcabc", "abcabcabcabcabcabc")
>>> a is b
True
>>> a="abc"*7 #长度21
>>> b="abc"*7 #长度21
>>> a is b
False
这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大,例如有人写了‘abc’*10**10这种代码。上述代码也可以通过dis方式看到不同处。4.和C#的字符串一样,Pyhton也提供intern方法强制2个字符串指向同一个对象,如下代码:
>>> import sys
>>> a="abcdef!"
>>> b="abcdef!"
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True5.实际上,对于整数数字,Python也会有驻留机制,但是只限于[-5,256]之间的数字。--------------------------------------分割线 --------------------------------------CentOS上源码安装Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htmPython脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm在Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htmPython 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htmPython 的详细介绍:请点这里
Python 的下载地址:请点这里 本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/114111.htm