python如何存储字符串以使';是';运算符处理文本?
用pythonpython如何存储字符串以使';是';运算符处理文本?,python,string,Python,String,用python >>> a = 5 >>> a is 5 True 但是 这是因为它将低整数存储为单个地址。但一旦数字开始变得复杂,每个int都会有自己独特的地址空间。这对我来说很有意义 当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用 那么现在,为什么这不适用于字符串呢?字符串不是和大整数一样复杂吗 python如何有效地为所有字符串文本使用相同的地址?它不能像对数字那样保留所有可能字
>>> a = 5
>>> a is 5
True
但是
这是因为它将低整数存储为单个地址。但一旦数字开始变得复杂,每个int都会有自己独特的地址空间。这对我来说很有意义
当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用
那么现在,为什么这不适用于字符串呢?字符串不是和大整数一样复杂吗
python如何有效地为所有字符串文本使用相同的地址?它不能像对数字那样保留所有可能字符串的数组。这是一种称为“interning”的优化技术。CPython识别,不为新实例分配额外的内存,只指向同一个实例(实习生),给它们提供相同的
id()
我们可以反复确认,只有常量是这样处理的(可以识别像b
这样的简单操作):
但是,您可以使用以下方法手动强制将字符串映射到已存在的字符串:
其他口译员可能会有不同的做法。由于字符串是不可变的,更改其中一个不会更改另一个。它不存储所有可能字符串的数组,而是有一个哈希表,指向所有当前声明字符串的内存地址,并通过字符串的哈希索引 比如说 当你说
a='foo'
时,它首先散列字符串foo
,并检查散列表中是否已经存在条目。如果是,则变量a
现在引用该地址
如果在表中找不到条目,python将分配内存来存储字符串,对foo
进行哈希运算,并在表中添加一个带有分配内存地址的条目
见:
is
比较对象id
sIt也比较内存地址。请参阅CPython IIRCIt中的id==内存地址。预定义整数的范围似乎是-5到+256。所有其他的似乎都是从文本中动态创建的,所以“is”返回False。不要标记为答案,因为你说“它的优化”,但不要解释它是如何存储的,这是个问题。或者换句话说,他们是如何进行优化的。
>>> a = 500
>>> a is 500
False
>>> a = '1234567'
>>> a is '1234567'
True
# Two string constants
a = "aaaa"
b = "aa" + "aa"
# Prevent interpreter from figuring out string constant
c = "aaa"
c += "a"
print id(a) # 4509752320
print id(b) # 4509752320
print id(c) # 4509752176 !!
c = intern(c)
print id(a) # 4509752320
print id(b) # 4509752320
print id(c) # 4509752320 !!