在python中
>>> a = 5
>>> a is 5
True
但是
>>> a = 500
>>> a is 500
False
这是因为它将低整数存储为单个地址。但是一旦数字开始变得复杂,每个int都会获得自己唯一的地址空间。这对我来说很有意义。
当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。
现在,为什么这不适用于字符串?字符串是否与大整数一样复杂(如果不是更多)?
>>> a = '1234567'
>>> a is '1234567'
True
python如何有效地为所有字符串文字使用相同的地址?它不能像数字一样保留每个可能字符串的数组。
答案 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
并在表中添加一个条目,其中包含已分配内存的地址。
请参阅: