Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何存储字符串以使';是';运算符处理文本?_Python_String - Fatal编程技术网

python如何存储字符串以使';是';运算符处理文本?

python如何存储字符串以使';是';运算符处理文本?,python,string,Python,String,用python >>> a = 5 >>> a is 5 True 但是 这是因为它将低整数存储为单个地址。但一旦数字开始变得复杂,每个int都会有自己独特的地址空间。这对我来说很有意义 当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用 那么现在,为什么这不适用于字符串呢?字符串不是和大整数一样复杂吗 python如何有效地为所有字符串文本使用相同的地址?它不能像对数字那样保留所有可能字

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