Python实习生字符串吗?

csv*_*van 12 python memoization string-interning

在Java中,显式声明的字符串由JVM实现,因此相同String的后续声明会产生两个指向同一String实例的指针,而不是两个单独的(但相同的)字符串.

例如:

public String baz() {
    String a = "astring";
    return a;
}

public String bar() {
    String b = "astring"
    return b;
}

public void main() {
    String a = baz()
    String b = bar()
    assert(a == b) // passes
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,CPython(或任何其他Python运行时)对字符串做同样的事情吗?例如,如果我有一些课程:

class example():
    def __init__():
        self._inst = 'instance' 
Run Code Online (Sandbox Code Playgroud)

并创建此类的10个实例,它们中的每一个都有一个实例变量引用内存中的相同字符串,或者我最终会得到10个单独的字符串?

Mar*_*ers 15

这称为实习,是的,Python在某种程度上这样做,对于作为字符串文字创建的较短字符串.有关讨论,请参阅关于更改Python不可变字符串的ID.

实习依赖于运行时,没有标准.如果要创建相同的字符串,实习总是在内存使用和检查成本之间进行权衡.如果您愿意,可以使用内置的intern()函数来强制解决问题,它会自动为您提供一些实用的Python 文档:

通常,Python程序中使用的名称会自动实现,而用于保存模块,类或实例属性的字典具有实习键.

请注意,Python 3将sys.intern()函数移动到intern()模块.