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

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

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

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

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

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

Ответы [ 4 ]

40 голосов
/ 08 января 2010

Ваш пример демонстрирует динамическую печать, а не слабую печать. Динамическая типизация обычно означает, что тип данных, которые может хранить объект, является изменчивым; любая цель может содержать привязку к любому виду объекта. Сравните это, скажем, с 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 является статическим». Это гораздо больше скользящей шкалы или спектра, чем двоичного свойства.

5 голосов
/ 08 января 2010

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

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

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

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

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

4 голосов
/ 08 января 2010

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

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

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

2 голосов
/ 08 января 2010

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

...