2010-01-08 18 views
10

De la manera que lo entiendo, lo siguiente está permitido en PHP porque es un lenguaje débilmente tipado.¿Python es un lenguaje débilmente tipado ya que las variables pueden cambiar de tipos?

$var = 'Hello'; 
$var = 5; 

acabo instalado una versión de Windows de Python 2.6 y esperaba que no se detenga a cambiar el tipo así como así, sino el equivalente Python del código anterior funciona igual que en PHP uff!

>>> var = "Hello" 
>>> type(var) 
<type 'str'> 
>>> var = 5 
>>> type(var) 
<type 'int'> 

¿Está mi comprensión de la debilidad/fuerte mecanografía defectuosa?

+0

Python es un lenguaje dinámico, por lo que está débilmente tipado en cierto sentido y fuertemente tipado en otros (no hay una sola definición), pero toda la pregunta es mucho más complicada que eso. Ver http://wiki.python.org/moin/StrongVsWeakTyping –

+0

posible duplicado de [¿Alguien me puede decir qué tipo de mecanografía fuerte y de mecanografía débil significa y cuál es mejor?] (Http://stackoverflow.com/questions/323323/ puede-alguien-decirme-qué-fuerte-escribir-y-escribir-débil-significa-y-que-uno-es-ser), y también [es-mi-comprensión-de-tipo-sistemas-corregir] (http://stackoverflow.com/questions/2135066/is-my-understanding-of-type-systems-correct) – nawfal

+1

Creo que esto no es una tontería, ya que es muy específico de Python. No es como si ya no pudiéramos hacer preguntas específicas sobre el lenguaje en el sistema de tipos porque se explicaron los tipos de letra fuertes y débiles en las respuestas a otras preguntas. Por un lado, incluso si se explicara allí, sería difícil de encontrar entre toda la otra información. –

Respuesta

39

Su ejemplo demuestra dinamización mecanografía, no mecanografía débil. La tipificación dinámica generalmente significa que el tipo de datos que un objeto puede almacenar es mutable; cualquier objetivo puede contener un enlace a cualquier tipo de objeto. Contraste eso con, por ejemplo, C#, que está tipado estáticamente [*].

int i = 5; // Okay. 
i = "5"; // Illegal! i can only hold integers. 

tipificación estricta significa que una vez le asigna un valor de un tipo particular, objetos obedecen a reglas estrictas acerca de cómo pueden interactuar con otros objetos de varios tipos. La mecanografía débil significa que tales reglas son más relajadas. Esto no significa que los lenguajes fuertemente tipados sean necesariamente superiores de ninguna manera; es solo una elección de diseño de lenguaje.

Python se considera fuertemente tipado porque los objetos tienen una noción distinta de lo que escriben que son. operaciones incompatibles entre objetos causan errores:

>>> 1 + 1   # Add two integers. 
2 
>>> "1" + "1"  # Concatenate two strings. 
'11' 
>>> 1 + int("1") # Add two integers. 
2 
>>> "1" + str(1) # Concatenate two strings. 
'11' 
>>> 1 + "1"  # Undefined! Adding integers and strings is meaningless. 
Traceback (most recent call last): 
    File "", line 5, in ? 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Pero en PHP, las reglas son mucho más relajado de lo que es aceptable. Por lo tanto, se considera más débilmente tipado que en otros idiomas.

$x = 1 + "1"; // x is 2 

[*] Técnicamente, a partir de C# 4, # C está estático de tipos, pero con exclusión de tipado dinámico en función de cada vinculante, gracias a la palabra clave dynamic. Actualmente, muchos idiomas están agregando capacidades dinámicas y difuminando las líneas, por lo que cada vez es más difícil decir que "el lenguaje X es dinámico" y el "idioma Y es estático". Es mucho más una escala móvil o un espectro que una propiedad binaria.

+3

Creo que quieres decir 2 para ese último, no '11'. –

+0

Vaya, gracias Ignacio. –

+1

Oh, ya veo. Lo tuve mezclado. Si quiero un lenguaje de tipo estático para la Web, probablemente debería ir con C# o Java. – confused

2

Sí. Esa no es una tipificación fuerte/débil, es decir, tipeo estático/dinámico. La tipificación débil permite que cosas como 5 + '5' sean 10.

+1

Interesante, por lo que Java sería de tipo débil, al menos en la relación de números primitivos y cadenas. –

4

No existe una definición real de tipeo débil o tipeo fuerte. Se trata de conversiones de tipos implícitos y no tiene nada que ver con el tipado estático/dinámico.

Un lenguaje de tipos estáticos como Java puede ser tipos débiles (no es ella), y un lenguaje de tipos dinámicos como PHP puede ser inflexible de tipos (no es que lo es).

Un lenguaje débilmente tipado es más liberal en cuanto a qué tipos de datos pueden mezclarse en ciertas operaciones.

+0

mal! El mayor problema de php que debilita a los tipos, porque puedes tener errores ocultos en el código como variables indefinidas, funciones, etc.- mantener la aplicación web de php muy difícil solo porque esa razón – Yosef

+1

@Yosef Tu comentario parece ser completamente sin relación con esta respuesta (que incorrectamente afirmas que está mal). –

5

Una adición la primera respuesta: Es un poco más complicado porque en python el operador + está sobrecargado, lo que significa que ambos agregarían (matemáticas) y concatenarían (pegar dos cadenas). En el ejemplo php

$i = 1 + "1" // $i == 2 

el plus añade (matemáticas), porque el. (Punto) se utiliza para la concatenación, por lo que en php

$i = 1 . "1" // $i == "11" 

Lo que estoy tratando de dejar claro es que cada tipos débiles/ofertas dinámicas del lenguaje con este en su propia manera.

Cuestiones relacionadas