2010-01-08 6 views
10

Как я понимаю, в PHP допускается следующее: это слабо типизированный язык.Является ли Python слабо типизированным языком в качестве переменных, которые могут переключать типы?

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

Я только что установил версию Windows, в Python 2.6 и я ожидал, чтобы не позволить мне изменить тип, как и что, но эквивалент Python выше код работает точно так же, как и в PHP Хлоп!

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

Является ли мое понимание слабых/сильных типичных ошибок?

+0

Python - динамический язык, поэтому он слабо типизирован в некотором смысле и строго типизирован в другом (нет единого определения), но весь вопрос намного сложнее. См. Http://wiki.python.org/moin/StrongVsWeakTyping –

+0

Возможный дубликат [Может ли кто-нибудь сказать мне, что такое сильная типизация и слабые методы набора текста, а какой лучше?] (Http://stackoverflow.com/questions/323323/ can-someone-tell-me-what-strong-typing-and-weak-typing-means-and-which-one-is-be), а также [правильно-понятное-системное-правильное] (http://stackoverflow.com/questions/2135066/is-my-understanding-of-type-systems-correct) – nawfal

+1

Я думаю, что это не обман, поскольку это очень специфично для Python. Это не значит, что мы больше не можем задавать конкретные вопросы по типу системы, потому что сильные и слабые формулировки объясняются в ответах на другие вопросы. Во-первых, даже если бы это объяснялось там, было бы трудно найти между всей другой информацией. –

ответ

39

Ваш пример демонстрирует динамический набрав, а не слабый ввод. Динамическое типирование обычно означает, что тип данных, которые может хранить объект, является изменяемым; любая цель может содержать привязку к любому типу объекта. Сравните это, скажем, с C#, который статически типизирован [*].

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

Строгая типизация означает, что когда-то присваивается значение определенного типа, объекты подчиняются строгие правила о том, как они могут взаимодействовать с другими объектами различных типов. Слабая типизация означает, что такие правила более расслаблены. Это не означает, что строго типизированные языки обязательно превосходят друг друга; это просто выбор языка.

Python считается строго типизированным, поскольку объекты имеют четкое представление о том, что они набирают. Несовместимые операции между объектами вызывают ошибки:

>>> 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' 

Но в PHP, правила гораздо более расслабленным о том, что является приемлемым. Таким образом, это считается более слабо типизированным, чем некоторые другие языки.

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

[*] Технически, по состоянию на C# 4, C# является статически типизированным, но с неавтоматического динамической типизации в расчете на необязательной основе, благодаря dynamic ключевому слову. Многие языки в эти дни добавляют динамические возможности и размывают линии, поэтому становится все труднее сказать, что «язык X является динамическим» и «язык Y статичен». Это гораздо больше скользящей шкалы или спектра, чем бинарное свойство.

+3

Я думаю, вы имеете в виду 2 для этого последнего, а не «11». –

+0

Ой, спасибо Игнасио. –

+1

О, я вижу. Я его перепутал. Если мне нужен статически типизированный язык для Интернета, я должен, вероятно, пойти с C# или Java. – confused

2

Да. Это не сильный/слабый ввод, это статическая/динамическая типизация. Слабая типизация позволяет таким вещам, как 5 + '5', равняться 10.

+1

Интересно - поэтому Java будет слабоподобным, по крайней мере, в отношениях примитивных чисел и строк. –

4

Не существует реального определения слабой типизации или сильной типизации. Его все о неявных преобразованиях типов и не имеет никакого отношения к статической/динамической типизации.

статически типизированный язык, как Java может быть слабо типизированный (не то, что это), и динамически типизированный язык, как PHP может быть сильно типизированных (не то, что она есть).

Слабо типизированный язык более либеральен в том, какие типы данных могут смешиваться в определенных операциях.

+0

Неверная самая большая проблема с php, что она слабые типы lang, потому что у вас могут быть скрытые ошибки в коде, такие как неопределенные переменные, функции и т. Д. - поддерживать веб-приложение php очень сложно только потому, что эта причина – Yosef

+1

@Yosef Ваш комментарий кажется полностью не связанный с этим ответом (который вы неправильно утверждаете, неверно). –

5

Одно добавление первый ответ: Это немного сложнее, потому что в python оператор + перегружен, что означает, что он добавит (математику) и объединит (склеит две строки). В PHP примере

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

плюс добавляет (математика), так как. (Точка) используется для конкатенации, поэтому в PHP

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

То, что я пытаюсь сделать ясно, что каждый слабо типизированных/динамический язык имеет дело с этим в своем собственном пути.