Является ли 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'>
Является ли мое понимание слабой/сильной типизации ошибочным?
4 ответа:
Ваш пример демонстрирует динамическую типизацию, а не слабую типизацию. Динамическая типизация обычно означает, что тип данных, которые объект может хранить, является изменяемым; любой целевой объект может содержать привязку к любому типу объекта. Сравните это, скажем, с C#, который статически типизирован [*].
Сильная типизация означает, что после присвоения значения определенного типа объекты подчиняются строгим правилам о том, как они могут взаимодействовать с другими объектами различных типов. Слабая типизация означает, что таких правил больше расслабленный. Это не означает, что строго типизированные языки обязательно превосходят другие; это просто выбор языкового дизайна. Python считается строго типизированным, потому что объекты имеют четкое представление о том, что они печатают. Несовместимые операции между объектами вызывают ошибки:int i = 5; // Okay. i = "5"; // Illegal! i can only hold integers.
>>> 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 статичен". Это гораздо больше скользящая шкала или спектр, чем бинарное свойство.
Одно дополнение первый ответ: Это немного сложнее, потому что в python оператор + перегружен, что означает, что он будет одновременно добавлять (математика) и объединять (склеивать две строки). В Примере php
$i = 1 + "1" // $i == 2
Плюс добавляет (математика), потому что. (dot) используется для конкатенации, поэтому в php
Я пытаюсь объяснить, что каждый слабо типизированный / динамический язык имеет дело с этим по-своему.$i = 1 . "1" // $i == "11"
Нет никакого реального определения слабого или сильного набора текста. Это все о неявных преобразованиях типов и не имеет ничего общего со статической/динамической типизацией.
Статически типизированный язык, такой как Java, может быть слабо типизированным (не то, что он есть), а динамически типизированный язык, такой как PHP, может быть сильно типизированным (не то, что он есть).
Слабо типизированный язык более свободен в том, какие типы данных могут быть смешаны в определенных операциях.