字符串驻留是个什么鬼!

先看下面这段代码

>>> a = 'apple'
>>> b = 'apple'
>>> a is b
True

返回结果看起来没毛病

字符串驻留是个什么鬼!_第1张图片

再来看这段:

>>> a = 'apple!'
>>> b = 'apple!'
>>> a is b
False

这个结果是不是有点诡异

字符串驻留是个什么鬼!_第2张图片

前后两个字符串仅仅是一字之差,结果完全不同。

不信你可以自己测试一下

为了理解这段代码的区别,里面涉及到一个概念,叫做“字符串驻留”,英文叫string intern。

什么是字符串驻留

python中万物皆对象,某些情况下,解释器遇到两个看起来长的一毛一样的对象时会做一些优化

例如上面例子中的第一段代码,a 和 b 的值都是 apple,当解释器准备创建第二个字符串”apple”时,解释器会去驻留内存中查找是否已经存在“apple”对象,如果有就不在创建新的对象了,两人共享一个老婆,哦不对,是共享一个对象。

字符串驻留是个什么鬼!_第3张图片

这就是字符串驻留的概念。

所以 a 和 b 这两个变量共享了同一个对象,因此 is 运算后返回结果为 True 。

字符串驻留是个什么鬼!_第4张图片

对于简单的字符串,系统中可能大量重复存在,这样的好处就是节省内存。驻留内存这个策略在java中也存在。

但并不是所有的字符串有会放进驻留内存中,如果都驻留的话,内存会爆炸。只有符合如下规则才有可能被驻留

  • 长度为 0 或者 1 的字符串被驻留.

  • 字符串中只包含字母,数字或下划线时将会驻留。

  • 字符串必须是编译时的常量字符串

例如下面的c用join方法生成的字符串就不会驻留

>>> a = "apple"
>>> c = "".join(['a','p','p','l','e'])
>>> a is c
False

这种驻留机制好像在实际应用中并没什么卵用,为什么我们还是要了解呢?至少我们在面试的时候可以 装下逼啊。。。

字符串驻留是个什么鬼!_第5张图片

- 完 -
Java编程思想(最新版)随着 Java 8 的出现,这门语言在许多地方发生了翻天覆地的变化。最新版已经出来了,在新的版本中,代码的运用和实现上与以往不尽相同。本书可作为编程入门书籍,同时也适用于想要扩展知识的在职程序员。下载方式1.扫码下方二维码2.后台回复关键词:思想▲长按关注,回复:思想其他最后推荐一下我的视频号,我从18年开始做公众号和知乎,两年时间涨了10多万粉丝,累积变现超50万,社交电商兴起的时候有用了一个多月时间升级成为芬香电商导师。所以如果你有折腾副业的想法可以来视频号上找我,我把我的一点微不足道的经验分享给你,一起加油!

你可能感兴趣的:(字符串驻留是个什么鬼!)