Подтвердить что ты не робот

Почему Python не выполняет преобразование типов при конкатенации строк?

В Python следующий код вызывает ошибку:

a = 'abc'
b = 1
print(a + b)

(Ошибка: "TypeError: не может конкатенировать объекты" str "и" int ").

Почему интерпретатор Python не пытается автоматически использовать функцию str(), когда встречает конкатенацию этих типов?

4b9b3361

Ответ 1

Проблема заключается в том, что преобразование неоднозначно, потому что + означает как конкатенацию строк, так и числовое добавление. Следующий вопрос был бы одинаково справедливым:

Почему интерпретатор Python не пытается автоматически использовать функцию int(), когда встречается добавление этих типов?

Это точно проблема с незакрепленной типизацией, которая, к сожалению, затрагивает Javascript.

Ответ 2

Там очень большая двусмысленность в таких операциях. Предположим, что вместо этого:

a = '4'
b = 1
print(a + b)

Неясно, следует ли принудительно выполнить a целое число (в результате получится 5), или если b следует принудить к строке (в результате получится '41'). Поскольку правила жонглирования типов являются транзитивными, передача числовой строки функции, ожидающей числа, может вызвать у вас проблемы, тем более что почти все арифметические операторы тоже перегружают операции для строк.

Например, в Javascript, чтобы убедиться, что вы имеете дело с целыми числами, а не с строками, обычной практикой является умножение переменной на единицу; в Python оператор умножения повторяет строки, поэтому '41' * 1 - это не-op. Вероятно, лучше просто попросить разработчика уточнить.

Ответ 3

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

Это было дизайнерское решение, сделанное Гвидо. Это могло быть так или иначе реально, сцепляя str и int с str или int.

Лучшее объяснение, по-прежнему такое, которое дает guido, вы можете проверить его здесь

Ответ 4

Поскольку Python не выполняет преобразование типов при конкатенации строк. Это поведение по дизайну, и вы должны привыкнуть к явным преобразованиям типов, когда вам нужно принуждать объекты к строкам или цифрам.

Измените свой код на:

a = 'abc'
b = 1
print(a + str(b))

И вы увидите желаемый результат.

Ответ 5

Python должен знать, что в строке сделать это правильно. Там двусмысленный случай: что должно '5' + 5 генерировать? Число или строка? Это должно обязательно вызвать ошибку. Теперь, чтобы определить, существует ли эта ситуация, python должен будет исследовать строку, чтобы рассказать. Должен ли он делать это каждый раз, когда вы пытаетесь объединить или добавить две вещи? Лучше просто позволить программисту явно преобразовать строку.

В общем, неявные преобразования, подобные этому, просто путают! Их трудно предсказать, трудно читать и трудно отлаживать.

Ответ 6

Другие ответы предоставили довольно хорошие объяснения, но не отметили, что эта функция известна как Strong Typing. Языки, которые выполняют неявные преобразования, являются слабо типизированными.

Ответ 7

Вот как они решили создать язык. Вероятно, логическое обоснование заключается в том, что требование явного преобразования в строку уменьшает вероятность непреднамеренного поведения (например, целочисленное добавление, если оба операнда являются ints вместо строк).

Ответ 8

сообщите python, что int является списком, чтобы устранить проблему "+".

['foo', 'bar'] + [5]

это возвращает: ['foo', 'bar', 5]