1 minuto(s) de lectura

Python efectivamente es fuertemente tipado y dinámico a la vez, para ello vamos a analizarlo por partes:

Tipado dinámico

Un lenguaje de programación usa un tipado dinámico cuando la comprobación de tipificación (typing) se realiza durante su ejecución y no en su compilación. 1

>>> numero = 1
>>> print(numero)
1
>>> numero = "uno"
>>> print(numero)
uno

Debido a ser de tipado dinámico, numero puede tener diferentes tipos en diferentes tiempos de ejecución: primero es un entero (int) y luego una cadena de texto (str). Esto permite mayor flexibilidad a costa de rendimiento por cierto.

Tipado fuerte

Un lenguaje de programación es fuertemente tipado si no se permiten violaciones de los tipos de datos, es decir, dado el valor de una variable de un tipo concreto, no se puede usar como si fuera de otro tipo distinto a menos que se haga una conversión. 2

>>> x = 1
>>> y = "2"
>>> print(x + y)
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print(x+y)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Compruébalo tu mismo, ejecuta primero (arrojará un TypeError) y luego modifícalo:

Debido a ser fuertemente tipado, los tipos deben ser compatibles para realizar ciertas operaciones como por ejemplo la adicción (o concatenación).

Concatenando (str + str):

>>> x = 1
>>> y = "2"
>>> x = str(x)
>>> print(x + y)
'12'

Adicionando (int + int):

>>> x = 1
>>> y = "2"
>>> y = int(y)
>>> print(x + y)
3

Lenguajes de programación de tipado débil como JavaScript realizan una conversión de datos internamente (coerción) que resultan poco intuitivas y pueden convertirse en una fuente de errores:

console.log(1 + 1 + 1); // Output: 3
console.log(1 + 1 + "1"); // Output: "21"
console.log("1" + 1 + 1); // Output: "111"

Actualizado: