¿Por qué Python no realiza la conversión de tipos al concatenar cadenas?

En Python, el siguiente código produce un error:

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

(El error es “TypeError: no se pueden concatenar los objetos ‘str’ y ‘int’).

¿Por qué el intérprete de Python no intenta automáticamente utilizar la función str () cuando encuentra la concatenación de estos tipos?

El problema es que la conversión es ambigua, porque + significa tanto concatenación de cadenas como sum numérica . La siguiente pregunta sería igualmente válida:

¿Por qué el intérprete de Python no intenta automáticamente usar la función int () cuando encuentra la adición de estos tipos?

Este es exactamente el problema de escritura floja que, lamentablemente, afecta a Javascript.

Hay un grado muy grande de ambigüedad con tales operaciones. Supongamos que ese caso en su lugar:

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

No está claro si a debe forzar a un entero (lo que da como resultado 5 ), o si se debe coaccionar a una cadena (lo que da como resultado '41' ). Dado que las reglas de malabares de tipo son transitivas, pasar una cadena numérica a una función que espera números podría causarle problemas, especialmente porque casi todos los operadores aritméticos también han sobrecargado las operaciones de las cadenas.

Por ejemplo, en Javascript, para asegurarse de que trata con números enteros y no con cadenas, una práctica común es multiplicar una variable por una; en Python, el operador de multiplicación repite cadenas, por lo que '41' * 1 es un no-op. Probablemente sea mejor simplemente pedirle al desarrollador que aclare.

La respuesta corta sería porque Python es un lenguaje fuertemente tipado.

Esta fue una decisión de diseño hecha por Guido. Podría haber sido de una manera u otra realmente, concatenando str y int para str o int .

La mejor explicación, sigue siendo la que da guido, puedes consultarla aquí.

Las otras respuestas han proporcionado explicaciones bastante buenas, pero no han mencionado que esta característica es conocida como Strong Typing. Los idiomas que realizan conversiones implícitas están tipificados débilmente.

Porque Python no realiza conversión de tipo al concatenar cadenas. Este comportamiento es por diseño, y debe acostumbrarse a realizar conversiones de tipos explícitos cuando necesite forzar objetos en cadenas o números.

Cambia tu código a:

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

Y verás el resultado deseado.

Python tendría que saber qué hay en la cadena para hacerlo correctamente. Hay un caso ambiguo: ¿qué debería generar '5' + 5 ? Un número o una cadena? Eso ciertamente debería lanzar un error. Ahora para determinar si esa situación es válida, Python tendría que examinar la cadena para indicar. ¿Debería hacerlo cada vez que intente concatenar o agregar dos cosas? Mejor simplemente dejar que el progtwigdor convierta la cadena explícitamente.

En términos más generales, las conversiones implícitas como esas son simplemente confusas. Son difíciles de predecir, difíciles de leer y difíciles de depurar.

Así es como decidieron diseñar el lenguaje. Probablemente la razón es que requerir conversiones explícitas a la cadena reduce la probabilidad de comportamiento no deseado (por ejemplo, la sum de enteros si ambos operandos son ints en lugar de cadenas).

Dígale a Python que int es una lista para desambiguar la operación ‘+’.

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

esto devuelve: [‘foo’, ‘bar’, 5]