Ситуация: начинающий программист более-менее освоил JavaScript и перешёл к Python. Чтобы освоить новый язык на практике, программист решил переписать свой старый проект с JavaScript на Python и столкнулся с таким фрагментом:
var a = 2;
var b = ' ствола';
var c = a + b;
Программист помнит, что в Python для переменных не нужен var, а можно просто объявлять их в нужном месте, поэтому он написал такой код:
a = 2
b = ‘ ствола’
c = a + b
Но при запуске проекта компьютер указал на последнюю строку и выдал ошибку:
Exception has occurred: TypeError
unsupported operand type(s) for +: ‘int’ and ‘str’
Почему так происходит: в JavaScript есть автоматическое приведение типов, и компьютер берёт на себя перевод данных из одного типа в другой. В нашем примере он сделает так:
- Возьмёт число и строку.
- Увидит, что их нужно сложить.
- Посмотрит по своим правилам, к какому одному типу проще всего привести всё в этой ситуации.
- Поймёт, что проще перевести число в строку, чем наоборот.
- Сделает так и на выходе получит строку «2 ствола»
Но Python так не умеет — ему нужно, чтобы данные были одного типа или хотя бы из одного семейства: оба числовые, оба строковые и так далее. Так как сейчас идёт сложение разных типов данных, то Питон говорит, что он так делать не будет, и падает с ошибкой.
Что делать с ошибкой Exception has occurred: TypeError
Чтобы исправить эту ошибку, нужно вручную привести данные к одному типу или явно указать их при операции.
В нашем случае можно сделать так: при сложении сказать компьютеру напрямую, что мы хотим в сложении использовать переменную a как строку:
a = 2
b = ‘ ствола’
c = str(a) + b
Команда str() не меняет тип и содержимое переменной a, но зато компьютер понимает, что это временно стало строкой, и спокойно её складывает со второй строкой.