在Java中,显式声明的String由JVM进行插值,因此对同一String的后续声明将导致指向同一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 }
我的问题是,CPython(或任何其他Python运行时)是否对字符串做相同的事情?例如,如果我有一些课:
class example(): def __init__(): self._inst = 'instance'
并创建10个此类的实例,是否每个实例都有一个实例变量,该实例变量引用内存中的同一字符串,还是我将得到10个单独的字符串?
这称为Interning,是的,对于创建为字符串文字的较短字符串,Python会在某种程度上做到这一点。有关一些讨论,请参见关于更改不可变字符串的id。
实习取决于运行时,没有标准。实习总是在内存使用和检查是否创建相同字符串的成本之间进行权衡。如果您愿意的话,可以使用该sys.intern()函数来强制执行此问题,该函数记录了 一些 实习Python自动为您提供的功能:
sys.intern()
通常,Python程序中使用的名称会被自动插入,并且用于保存模块,类或实例属性的字典具有插入键。
请注意,Python 2该intern()函数曾经是内置函数,无需导入。
intern()