Конкатенация
Конкатенация — операция склеивания двух последовательностей в одну, чаще всего строк: результат содержит символы первой, а затем второй.
Что такое Конкатенация
Конкатенация (от лат. concatenatio — сцепление) — операция склеивания двух последовательностей в одну. Результат содержит элементы первой, за которыми идут элементы второй, порядок сохраняется.
Конкатенация строк — самый частый случай: "cloud" + "compute" даёт "cloudcompute". Никакого разделителя не добавляется: пробел нужно ставить явно, это источник классической ошибки "Привет" + "мир" → "Приветмир".
Операция не ограничена строками — склеивать можно списки, массивы, кортежи, байты, а в базах данных — таблицы через UNION.
Ключевые свойства
- Ассоциативна:
(a + b) + cравноa + (b + c). - Не коммутативна:
"ab" + "cd"≠"cd" + "ab". Порядок операндов важен. - Нейтральный элемент — пустая строка:
s + "" == s.
Как это выглядит в разных языках
| Язык | Оператор | Пример |
|---|---|---|
| Python | + |
"a" + "b" |
| JavaScript | + |
'a' + 'b' |
| Java | + |
"a" + "b" |
| PHP | . |
'a' . 'b' |
| SQL (стандарт) | || |
'a' || 'b' |
| MySQL | CONCAT() |
CONCAT('a', 'b') |
| Bash | рядом | s="$a$b" |
Разнобой с SQL стоит запомнить: в PostgreSQL и SQLite работает ||, в MySQL по умолчанию || — это логическое ИЛИ, и склеивать нужно через CONCAT().
Строки неизменяемы — отсюда главная ловушка
В Python, Java, JavaScript и C# строки immutable: a + b не дописывает в конец, а создаёт новый объект и копирует туда оба операнда. Конкатенация в цикле поэтому квадратична — на каждой итерации копируется всё накопленное:
# плохо: O(n²) — каждый += копирует всю строку заново
result = ""
for row in rows:
result += row + "\n"
# хорошо: O(n) — один проход, одна аллокация
result = "\n".join(rows) + "\n"
На тысяче строк разницу не заметно, на миллионе — это секунды против миллисекунд. Правило простое: склеиваете в цикле — используйте join (Python), StringBuilder (Java), strings.Builder (Go), array.join() (JavaScript).
Что использовать вместо +
Для вставки значений в текст конкатенация проигрывает интерполяции — та короче и не требует ручного приведения типов:
name, count = "sales", 42
"Отчёт " + name + ": " + str(count) + " строк" # ручной str(), легко забыть
f"Отчёт {name}: {count} строк" # f-строка, читается лучше
`Отчёт ${name}: ${count} строк` // шаблонная строка
Отдельный случай — SQL. Собирать запрос конкатенацией нельзя: это прямой путь к SQL-инъекции.
# опасно: значение попадает в текст запроса
cur.execute("SELECT * FROM users WHERE email = '" + email + "'")
# правильно: параметризованный запрос, драйвер экранирует сам
cur.execute("SELECT * FROM users WHERE email = %s", (email,))
Конкатенация не только строк
[1, 2] + [3, 4] # [1, 2, 3, 4] — списки
(1, 2) + (3,) # (1, 2, 3) — кортежи
b"ab" + b"cd" # b'abcd' — байты
В SQL конкатенацией по сути является UNION ALL — он склеивает результаты двух выборок в одну. В NumPy и PyTorch есть concatenate и cat, соединяющие массивы вдоль выбранной оси.
Складывать при этом можно только совместимые типы. "1" + 1 в Python — ошибка, а в JavaScript даст "11": там + при строке приводит второй операнд к строке. Это различие — следствие строгой и слабой типизации.
Связанные термины
- Типы данных и типизация — почему
"1" + 1ведёт себя по-разному - Python — join, f-строки и подводные камни
+= - Java — где вместо
+в цикле нужен StringBuilder - SQL — оператор
||, CONCAT и риск инъекции - Регулярные выражения — соседняя операция над строками
Готовы запустить GPU-задачу?
Запустить GPU-сервер