Python不重用包含空格符的字符串

发布于 2022-09-01 06:15:51 字数 370 浏览 34 评论 0

我记得Python是使用内存池来管理整形数和小的字符串,也就是说a='abc'时,Python是先查找是否存在对象abc,如果存在,则a直接引用它,不存在再创建对象abc。但是,我在Python3的IDLE中遇到下面的现象:
图片描述

注意到,当字符串中包含空格符时,貌似Python就不会去找(或者说找不到)已经存在的对象a b,而是重新创建了一个。
请问,这是为什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

多情癖 2022-09-08 06:15:51

正如@足兆叉虫所说,这不是语言特性,属于实现层面的东西。
我来补充一下。 @Reuynil 。欢迎探讨。


这个问题与Python的intern机制有关。
简单来说就是:在交互式环境下,Python只会对包含Python identifiers(下划线、数字、字母)的字符串进行intern。空格不属于Python identifiers。所以,id(c) != id(d)
感兴趣的可以去查看一下Python源码里的stringobject.h文件,注释上有这么一段:

This is generally restricted to strings that "look like"
Python identifiers, although the intern() builtin can be used to force
interning of any string.

当然,Python的内部机制不会这么简单的,会存在特殊处理的情况。比如执行>>> a = " ">>> b = " ">>> a is b得到的结果是True。存在这个矛盾的情况是因为对于0或1个字符的字符串,Python是进行了intern处理的。

可见,对于任意字符串Python都是可以进行intern处理的,只不过对于问题中的情况,Python在实现时选择了不处理而已,所以说,这是一个实现的问题,不是语言特性。

另外,你可以将代码写到脚本中,会发现得到的都是True

墨离汐 2022-09-08 06:15:51

这不是语言特性,视具体实现不同而定。

从﹋此江山别 2022-09-08 06:15:51

这要看字符串里有什么,有空格的时候内存存放位置就不一样了,你用id(a)、id(b)、id(c)、id(d)来看这几个变量的id值就知道了。
数字的情况,可以参考:

>>> a=2
>>> b=2
>>> a is b
True
>>> a=2.5
>>> b=2.5
>>> a is b
False
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文