Это потому, что строки неизменны .
Оператор +=
, довольно странно, на самом деле переназначает переменную, к которой он применяется, если объект являетсяimmutable:
s = 'a'
ids = id(s)
s += 'b'
ids == id(s) # False, because s was reassigned to a new object
Итак, в вашем случае, в начале, оба flav
и a.flavor
указывают на один и тот же строковый объект:
flav --------\
'cherry'
a.flavor ----/
Но когда вы пишете flav += 'and grape'
переменная flav
возвращает переназначение на новый строковый объект:
flav --------> 'cherry and grape'
a.flavor ----> 'cherry' # <-- that string object never changes
Это сбивает с толку, потому что обычно, когда вы вызываете оператор для переменной, это не такизменить переменную.Но в случае неизменяемого объекта он переназначает переменную.
Итак, окончательный ответ на ваш вопрос: да, имеет смысл копировать объекты при создании экземпляра, особенно если вы ожидаете изменяемыйобъект (что часто бывает).Если объект был неизменным, копировать его все равно не повредит.