Python str(“str”)是否始终是一个标识函数?

Python str(“str”)是否始终是一个标识函数?,python,string,string-interning,Python,String,String Interning,这里有一个简单的问题: 我发现,对于某些对象,调用str实际上可以创建一个新的对象引用 >>> a = 1 >>> str(a) is str(a) False 然而,我注意到这对于字符串来说是不正确的(这看起来很直观)。str方法是否始终充当str对象的标识函数?或者,由于字符串内部优化,这个属性看起来是正确的,实际上可能不会返回相同的引用 >>> a = "1" >>> a is str(a) True >>

这里有一个简单的问题:

我发现,对于某些对象,调用
str
实际上可以创建一个新的对象引用

>>> a = 1
>>> str(a) is str(a)
False
然而,我注意到这对于字符串来说是不正确的(这看起来很直观)。
str
方法是否始终充当
str
对象的标识函数?或者,由于字符串内部优化,这个属性看起来是正确的,实际上可能不会返回相同的引用

>>> a = "1"
>>> a is str(a)
True
>>> str(a) is str(a)
True
这是一个全局规则/语言规范规则,还是依赖于解释器

FWIW我问这个问题是因为在一些地方我保护了一些方法,以确保使用
str
实例。我想知道我是否通过添加冗余的
str
调用输入来创建垃圾,这些输入已经是
str
。e、 g

def safeguard_foo(val):
    foo(str(val))
另一种选择是以更详细的方式进行保护(值得注意的是,这种方法无论如何要快25%,因此在性能方面,它甚至在考虑垃圾创建问题之前就已经胜出了)。e、 g


@CharlesDuffy特别是我有一些代码保护
str
被传递,我想知道我是否通过添加冗余的
str
调用来创建垃圾,这些对象已经是stringsGotcha!在CPython中,你肯定不是,但我不认为这是语言规范的保证。如果其他人没有先这样做的话,我会在有时间的时候进行挖掘。其他人进行挖掘的简要说明:
PyTypeObject.tp_str
是一个很好的开始<同样,code>Objects/object.c的
PyObject\u Str
实现。我不再像以前那样确信冗余的
str()
调用永远不会产生GC负载,但目前还不能证明这一点。不要担心这一点,除非它实际上导致了性能问题。即使没有优化,大多数情况下,差异也可以忽略不计。以读者最清楚的方式编写,如有必要,稍后再考虑性能。在第二段中,“对于字符串对象,这是字符串本身。”是否意味着这是标识操作?我会将这个令人困惑的句子解释为“是”,这是身份操作。
def safeguard_foo(val):
    if not isinstance(val, str):
        val = str(val)
    foo(val)