2011-06-17 22 views
21

En Python, el siguiente código produce un error:¿Por qué Python no realiza la conversión de tipo al concatenar cadenas?

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

(El error es "TypeError: No se puede concatenar 'str' y los objetos 'int'").

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

+8

"Frente a la ambigüedad, rechaza la tentación de adivinar." (Alguien tuvo que decirlo). – DSM

+2

Sí, ¿y por qué no intenta convertir 'abc' a int y agregar a 1? Apples + Bananas te da qué? – JBernardo

+1

@JBernardo ensalada de frutas? –

Respuesta

27

El problema es que la conversión es ambigua, porque + significa tanto concatenación de cadenas y Además numérico. La siguiente pregunta sería igualmente válido:

Why does the Python interpreter not automatically try using the int() function when it encounters addition of these types?

Este es exactamente el problema suelta-escritura que lamentablemente afecta a Javascript.

+0

Se siente como si fuera capaz de decir desde el contexto (un argumento a la función print()) que esto debería ser una cadena, pero supongo que no puede hacer eso sin argumentos escritos a funciones. ¿Hay alguna razón para sobrecargar al operador '+' de esta manera? – Symmetric

+3

No hay un motivo * específico que no sea el uso común de '+' en los lenguajes de programación. Otros lenguajes utilizan diferentes operadores para adición y concatenación; Python podría haber hecho lo mismo. –

+0

Muy bueno para recordar esto, respondiendo con una pregunta opuesta :-) Me gusta! +1 – tim

10

Hay un gran grado de ambigüedad con tales operaciones. Supongamos que el caso en su lugar:

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

No está claro si a debe ser obligado a un número entero (que resulta en 5), o si b debe ser obligado a una cadena (que resulta en '41'). Como las reglas de malabarismo de tipo son transitorias, pasar una cadena numérica a una función que espera números podría ocasionarle problemas, especialmente dado que casi todos los operadores aritméticos también han sobrecargado operaciones para cadenas.

Por ejemplo, en Javascript, para asegurarse de que se ocupa de enteros y no de cadenas, una práctica común es multiplicar una variable por uno; en Python, el operador de multiplicación repite cadenas, por lo que '41' * 1 es una operación nula. Probablemente sea mejor pedirle al desarrollador que aclare.

2

Porque Python no realiza la conversión de tipo al concatenar cadenas. Este comportamiento es por diseño, y debe adquirir el hábito de realizar conversiones de tipo explícitas cuando necesite forzar objetos en cadenas o números.

cambiar el código para:

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

y verá el resultado deseado.

2

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 cuerda? Eso debería arrojar un error. Ahora, para determinar si esa situación es válida, Python tendría que examinar la cadena para contarla. ¿Debería hacer eso cada vez que intentas concatenar o agregar dos cosas? Mejor solo dejar que el programador convierta la cadena explícitamente.

Más en general, las conversiones implícitas como esa son simplemente confusas. Son difíciles de predecir, difíciles de leer y difíciles de depurar.

1

Así es como decidieron diseñar el lenguaje. Probablemente la razón sea que requerir conversiones explícitas a la cadena reduce la probabilidad de un comportamiento involuntario (por ejemplo, la suma entera si ambos operandos pasan a ser enteros en lugar de cadenas).

2

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

5

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 una manera u otra realidad, la concatenación de str y int a str o int.

La mejor explicación, sigue siendo la dada por guido, se puede comprobar que here

+1

Sin embargo, la tipificación fuerte no explica esto: si Python se tipeó fuertemente y estáticamente, entonces el intérprete podría convertir todos los argumentos de la función print (String str) a tipo de cadena (como hace Java con toString()). Es porque Python tiene un tipado fuerte y dinámico para que se produzca este problema. – Symmetric

1

pitón dicen que el int es una lista para eliminar la ambigüedad de la operación '+'.

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

esto devuelve: [ 'foo', 'valor', 5]

Cuestiones relacionadas