现在的位置: 首页 > 综合 > 正文

浅谈python字符串存储形式

2017年10月06日 ⁄ 综合 ⁄ 共 956字 ⁄ 字号 评论关闭

http://blog.csdn.net/zhonghuan1992

钟桓

2014年8月31日

浅谈python字符串存储形式


记录一下自己今的天发现疑问并且给出自己现有知识有的回答。长话短说,用过python的人对于 == 和 is 应该不陌生,但是这里我还是介绍一下。

==是用来判断两个东西是否相等,比如:

a = 10;
b = 10;
print(a == b);

输出是true;

再看一个例子:

a = [1,2,3];
b = [1,2,3];
c = [1,2,4];
print(a==b);
print(a==c);

输出分别是 true 和 false ;


再来看 is ;是用来判断同一性而不是相同性。

来看下面的例子:

x = [1,2,3];
y = [1,2,3];
print(x is y);

输出是 false;


而只有:

x = [1,2];
y = x;
print(x is y);

输出是true;


从上面的例子中可以看出 == 和 is 两个的区别之处。

现在疑问来了,我们把对比的东西换成是字符串的话,结果是否会出乎你意料。看下面的例子:

x = “huan”;
y = x;
print(x == y);
print(x is y);

我想大家能够猜出输出什么。

输出是:true

              true


现在看下面的例子:

x = “huan”;
y = “huan”;
print(x == y);
print(x is y);

大家猜,结果是什么?

输出是:true

              true

为什么会这样呢?x 和  y 相等可以理解,可是为什么x和y是同一个对象?据我猜测,python内部存储字符串,采用的是享元模式(Flyweight
pattern)
什么是享元模式,可以看我前些日子写的一篇blog,http://blog.csdn.net/zhonghuan1992/article/details/38856591

享元模式是为了减少存储空间而做的一种优化手段。经过上面的探讨,我们知道字符串内容相同的两个字符串,其实指向的是同一个对象,这个正是享元模式所做的,所以个人猜测其内部的实现机制就是依据这个模式。

那么为什么可以使用这个模式呢?学过python的同学应该了解,字符串在python中属于不变的类型,和元组(tuple)一样,因为这个原因,字符串是可以采用享元模式的。

这是我目前的理解,如果各位有其它见解,请留下你的见解我们讨论一下。

抱歉!评论已关闭.