Является ли Python слабо типизированным языком, поскольку переменные могут переключать типы?

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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