Вот такой простой вопрос:
Я вижу для некоторых объектов, что вызов 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
. например,
def safeguard_foo(val):
foo(str(val))
Другим вариантом является обеспечение более многословной защиты (стоит отметить, что этот метод в любом случае работает примерно на 25% быстрее, поэтому с точки зрения производительности он выигрывает даже до рассмотрения вопросов, связанных с созданием мусора). например, * * 1 022
def safeguard_foo(val):
if not isinstance(val, str):
val = str(val)
foo(val)