Почему Python не выполняет преобразование типов при объединении строк? - PullRequest
23 голосов
/ 17 июня 2011

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

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

(Ошибка «Ошибка типа: невозможно объединить объекты str и int»).

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

Ответы [ 8 ]

30 голосов
/ 17 июня 2011

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

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

Это именно та проблема со свободным набором текста, которая, к сожалению, поражает Javascript.

13 голосов
/ 17 июня 2011

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

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

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

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

5 голосов
/ 17 июня 2011

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

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

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

3 голосов
/ 17 июня 2011

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

2 голосов
/ 17 июня 2011

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

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

2 голосов
/ 17 июня 2011

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

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

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

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

1 голос
/ 19 ноября 2014

сообщает python, что int - это список для устранения неоднозначности операции '+'.

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

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

1 голос
/ 17 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...