python如何存储字符串以便'是'运算符在文字上工作?

时间:2016-10-12 21:54:26

标签: python string

在python中

>>> a = 5
>>> a is 5
True

但是

>>> a = 500
>>> a is 500
False

这是因为它将低整数存储为单个地址。但是一旦数字开始变得复杂,每个int都会获得自己唯一的地址空间。这对我来说很有意义。

  

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。

现在,为什么这不适用于字符串?字符串是否与大整数一样复杂(如果不是更多)?

>>> a = '1234567'
>>> a is '1234567'
True

python如何有效地为所有字符串文字使用相同的地址?它不能像数字一样保留每个可能字符串的数组。

2 个答案:

答案 0 :(得分:3)

这是一种称为实习的优化技术。 CPython识别equal values of string constants并且没有为新实例分配额外的内存,而只是指向同一个实例(实习它),同时给出相同的id()

可以发挥作用来确认只有这样的常量被处理(像b这样的简单操作被识别):

# 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 !!

但是,您可以使用intern()手动强制将字符串映射到现有字符串:

c = intern(c)

print id(a)         # 4509752320
print id(b)         # 4509752320
print id(c)         # 4509752320 !!

其他口译员可能会采用不同的方式。由于字符串是不可变的,因此更改其中一个不会改变另一个。

答案 1 :(得分:0)

它不存储所有可能字符串的数组,而是有一个哈希表,指向所有当前声明的字符串的内存地址,由字符串的哈希索引。

例如

当你说a = 'foo'时,它首先散列字符串foo并检查哈希表中是否已存在某个条目。如果是,则变量a现在引用该地址。

如果表中没有找到任何条目,python会分配内存来存储字符串,哈希foo并在表中添加一个条目,其中包含已分配内存的地址。

请参阅:

  1. How is the 'is' keyword implemented in Python?
  2. https://en.wikipedia.org/wiki/String_interning