C#中的字符串驻留

熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝。如果仅在运行期间值才相同的字符串变量,.NET不会为这个2个相同的字符串变量指向同一份引用的。不过.NET提供了一个方法,让开发人员可以强制将两个相同的字符串指向同一个引用,使用String类中的Intern方法。

1
2
3
4
5
6
7
8
9
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 b

2.编译期间就确定了的字符串,也采用驻留机制,但是,仅限于以下这些字符:

"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

先解释一下什么叫做编译期间,Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件,之后再由Python虚拟机运行。这一点,和.Net的Framework、Java虚拟机很类似。(更多相关内容可以参考《Learning Python》),因此有些代码会在翻译成字节码的时候,就自动的帮程序员预先计算了。

我们可以通过dis方法(分解Python中的字节码 )来验证,可以通过python -m dis xxx.py这样的命令来查看

举例:如下的一个Python文件test.py

a='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

False

3.通过乘法运算符得到的字符串,长度必须小于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

True

5.实际上,对于整数数字,Python也会有驻留机制,但是只限于[-5,256]之间的数字。

参考文档

http://guilload.com/python-string-interning/

http://www.laurentluce.com/posts/python-string-objects-implementation/

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1615356,如需转载请自行联系原作者

Python中的字符串驻留相关推荐

  1. Python中的字符串驻留机制

    字符串驻留机制(引用计数机制): 字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法. 系统维护interned字典,记录已被驻留的字符串对象. 对于短字符串,将其赋值给多个不同的对象时,内存 ...

  2. python字符串驻留机制_Python中的字符串驻留

    C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET才会为这个2 ...

  3. 超详细的Python中的字符串常识【赶紧收藏】

    今天我们说说字符串类型,涉及很多基础知识,不过字符串还是需要在多讲讲的. 回顾一下:字符串与长字符串 Python非常简单,并没有专门分出一个char(Character)类型(搞过C/Java的同学 ...

  4. 在Python中连接字符串的首选方法是什么?

    本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...

  5. 如何在Python中获取字符串的子字符串?

    有没有一种方法可以在Python中为字符串加上字符串,以从第三个字符到字符串的末尾获取新的字符串? 也许像myString[2:end] ? 如果离开第二部分意味着"直到最后",而 ...

  6. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  7. python中定义字符串_python中的字符串

    python中的字符串一旦定义,则不可以修改 python中的原始字符串 即 在字符串前面加小写字母r 比如:打印输出C:\Program Files\Microsoft Games python中的 ...

  8. python字符计数怎样去除空格_去除python中的字符串空格的简单方法

    python编程中,我们在修改代码,遇到空格很多的情况下,我们要删除空格.本文小编整理了三种字符串去除空格的方法: 方法一:使用字符串函数replace,去除全部空格. 实例: >>> ...

  9. python中的字符串是什么,一文秒懂Python中的字符串

    摘要:本文将告诉您Python中的字符串是什么,并向您简要介绍有关该概念的所有知识. 因此,让我们开始吧. 什么是Python中的字符串? 我们许多熟悉C,C ++等编程语言的人都会得到诸如" ...

最新文章

  1. 【Arduino】开发入门教程【一】什么是Arduino
  2. Excel公式与函数案例速查手册/电脑技巧从入门到精通丛书
  3. 论文首页下划线怎么对齐_毕业论文标准格式要求是什么样的?
  4. 解决VsCode中C程序无法键盘输入的问题
  5. 使用 RandomStringUtils 类来生成随机码/随机数
  6. 为什么在C语言中,用scanf输入字符串时,不需加
  7. 44 万条数据揭秘:如何成为网易云音乐评论区的网红段子手?
  8. 2021Java春招,java求职简历模板下载
  9. unity3d赛车游戏视频教程
  10. 图片怎么去底色?怎么去图片背景为透明?
  11. 软件设计师 如何准备考试(转载)
  12. 7位白手起家的亿万富豪的7大独特做事准则 凤凰科技02-0411:46 原标题:7位白手起家的亿万富豪的7大独特做事准则 那些白手起家的亿万富翁企业家是否有一些独特的思维方式和做事准则,从而让自己获得
  13. Spring - 事件监听机制 源码解析
  14. 最喜欢突然说分手的星座,有TA吗?
  15. 深度学习需要多强的数学基础?
  16. 数据恢复如何看异或问题
  17. AJAX基础电子教程
  18. JavaScript中如何严格的判断NaN
  19. 【C语言】PAT乙级1002 :写出这个数
  20. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——5.Android手机端与robot端ROS网络通信...

热门文章

  1. 2021-2030 无人机行业十大发展趋势
  2. 热点快评:德国强化AI战略,系统、技术等“多轮并行”
  3. 自动驾驶汽车对保险业的影响
  4. 如果中国要做自己的GPT-3,一定离不开这家公司的算力
  5. TensorFlow Lattice:灵活、可控、可解释的机器学习
  6. SAP SD基础知识之信用范围数据维护
  7. 「杂谈」如何系统性地学习生成对抗网络GAN
  8. 人工智能时代,最先占领高维度空间
  9. 19个人工智能(AI)热门应用领域,你知道多少?
  10. SAP WM Production Schedule Profile设置问题导致生产补货的TO单自动创建问题