请考虑:
a = str(123456789)
b = str(123456789)
a is b # False
后一行的结果为False
,因为a
和b
不是同一个对象,即使它们可以是(因为字符串是不可变的)。因此,如果我有很多相同的字符串“副本”存在,那么我可能会使用比我需要的更多的内存。这就是为什么intern
(Py2)和sys.intern
(Py3)存在的原因!
a = intern(str(123456789))
b = intern(str(123456789)) # Call to "intern" technically pointless
a is b # True
intern
从内存角度来看有没有任何缺点?(除了调用函数的微小时间成本之外)。我从文档中理解到(例如https://docs.python.org/2/library/functions.html#intern),只要我保持对字符串的引用,字符串就会一直存在于 intern 表中,因此在只有一个字符串副本的情况下,这应该与直接分配给字符串使用相同的内存量,如果我有多个副本,那么显然当我将其 intern 后,内存使用量会更低。
intern()
调用是无意义的。然而,要想弄清楚这个实现细节发生的时间还是需要一些运气的;请阅读:http://guilload.com/python-string-interning/ - Chris_Rands