Является ли python + = конкатенация строк плохой практикой?

Я читаю Справочник автостопов по Python и есть короткий фрагмент кода

foo = 'foo'
bar = 'bar'

foobar = foo + bar  # This is good
foo += 'ooo'  # This is bad, instead you should do:
foo = ''.join([foo, 'ooo'])

Автор указал, что ''.join() не всегда быстрее, чем +, поэтому он не против использования + для конкатенации строк.

Но почему существует foo += 'ooo' плохая практика, тогда как foobar=foo+bar считается хорошей?

  • foo += bar хорошо?
  • foo = foo + 'ooo' хорошо?

До этого фрагмента кода автор написал:

Последнее, что нужно сказать о строках, заключается в том, что использование join() не всегда лучше. В тех случаях, когда вы создаете новую строку из предварительно определенного числа строк, использование оператора сложения выполняется быстрее, но в случаях, подобных выше или в случаях, когда вы добавляете существующую строку, использование join() должно быть ваш предпочтительный метод.

Ответ 1

Это плохая практика?

Разумно предположить, что это неплохая практика для этого примера, потому что:

  • Автор не дает никаких оснований. Может быть, это просто не понравилось ему/ей.
  • Документация Python не упоминает о плохой практике (из того, что я видел).
  • foo += 'ooo' так же читаем (по мне) и примерно в 100 раз быстрее, чем foo = ''.join([foo, 'ooo']).

Когда нужно использовать другой?

Конкатенация строк имеет недостаток в необходимости создания новой строки и выделения новой памяти для каждой конкатенации! Это отнимает много времени, но это не так уж и важно для нескольких и маленьких строк. Когда вы знаете количество строк для конкатенации и не нуждаетесь в более чем 2-4 конкатенациях, я бы пошел на это.


При подключении строк Python должен выделять новую память для последней строки, что намного эффективнее, но может потребоваться больше времени для вычисления. Кроме того, поскольку строки являются неизменными, часто более практично использовать список строк для динамического мутирования и только преобразовывать его в строку при необходимости.

Часто бывает удобно создавать строки с str.join(), так как он принимает итерабельность. Например:

letters = ", ".join("abcdefghij")

В заключение

В большинстве случаев имеет смысл использовать str.join(), но есть моменты, когда конкатенация столь же жизнеспособна. Использование любой формы конкатенации строк для огромных или многих строк было бы плохой практикой, так как использование str.join() было бы плохой практикой для коротких и нескольких строк, по моему мнению.

Я считаю, что автор просто пытался создать эмпирическое правило, чтобы легче определить, когда использовать то, что не нужно слишком подробно или затруднять.