python中的intern机制

本文探讨了Python中字符串池的机制及intern方法的应用。详细分析了在Python2.7.10环境下,字符串如何自动调用intern机制,以及长度和内容对这一过程的影响。
部署运行你感兴趣的模型镜像

python中由于字符串池机制的存在也由此而生出了一些方法。
以下在python2.7.10上执行关于字符串

字符串的话,字母数字下划线,会自动调用intern机制,单个字符的话也会相同
含有空格等字符串则不会放入字符串中。
关于长度也有限制。
终端中的字符串长度<=20个,和>20时候也是不同
关于字符串长度的限制
a=“inter”
b=“intern”
a+“n” is b (1)
1式会返回false
因为前半部分是在运行时进行拼接,没有自动调用intern机制
若是inter(a+“n”) is b 则是返回false。

参考:https://www.cnblogs.com/greatfish/p/6045088.html
https://stackoverflow.com/questions/15541404/python-string-interning

				---愿有持续学习的能力

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python的驻留机制是一种内存优化技术,用于处理字符串和某些整数,目的是减少不必要的内存分配和回收,提高程序的运行效率 [^1]。 ### 定义 Python的驻留机制Python解释器对值相同的变量进行内存处理的一种方式。当多个变量引用同一个不可变对象(如某些整数和字符串)时,这些变量将共享同一个内存地址 [^1]。 ### 工作原理 #### 字符串驻留 - **小字符串**:Python 只会对短小的字符串进行驻留,这个长度不固定,会因 Python 的不同版本或实现而有所不同 [^4]。 - **字符串池**:Python 解释器维护一个字符串池,用于存储所有已经出现过的字符串常量 [^4]。 - **驻留过程**:当解释器遇到一个新的字符串字面量时,会首先检查该字符串是否已存在于字符串池中。若存在,则直接使用池中的引用;若不存在,就将这个字符串添加到池中,并返回该字符串的引用 [^4]。 #### 整数驻留 Python解释器为了优化内存使用和提高性能,预分配了一组整数对象,覆盖了 -5 到 256 之间的范围(包括 -5 和 256)。当程序创建一个在这个范围内的整数时,Python不会创建新的整数对象,而是直接引用已存在的对象 [^5]。 ### 示例代码 ```python # 字符串驻留示例 a = 'hello' b = 'hello' print(a is b) # 输出: True # 整数驻留示例 c = 100 d = 100 print(c is d) # 输出: True # 超出小整数范围的整数不驻留 e = 257 f = 257 print(e is f) # 输出: False ``` ### 驻留情况 - **整数**:[-5, 256] 之间的整数会驻留 [^2]。 - **字符串**:符合命名规范的字符串、长度为 0 或 1 的字符串会驻留。例如,'wang' 符合命名规则会驻留,'@qq.com' 有特殊字符不会驻留,长度为 1 的字符串 '!' 会驻留 [^2]。 ### 限制 - **不可变类型**:该机制只适用于不可变类型,因为可变类型的对象内容可能会改变,会使引用地址比较失去意义,若字符串可修改,驻留机制可能导致意外的副作用 [^4]。 - **动态生成字符串**:若程序中使用大量动态生成的字符串,字符串驻留可能不会带来太大好处,因为这些字符串可能不会被重复使用 [^4]。 - **字符串字面量**:只有当字符串是字面量时,Python 才会尝试进行驻留,通过其他方式(如 str() 函数、字符串拼接等)创建的字符串通常不会被驻留 [^4]。 - **编译时驻留**:字符串驻留是在 Python 源代码编译成字节码时进行的,而非在运行时,这意味着运行时动态生成的字符串通常不会被驻留 [^4]。 - **不确定性**:即使字符串满足驻留条件,也不保证它一定会被驻留,Python 解释器在实现驻留机制时有一定的自由度,可能会根据内存使用情况、解释器的具体实现等因素来决定是否驻留某个字符串 [^2]。 ### 显式驻留 Python 提供了 `sys.intern()` 函数来显式地对字符串进行驻留。示例如下: ```python import sys s1 = sys.intern('hello world') s2 = sys.intern('hello world') print(s1 is s2) # 输出: True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值