Является ли 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'>

Есть ли у меня недостатки в понимании слабой / строгой типизации?


person confused    schedule 08.01.2010    source источник
comment
Python - это динамический язык, поэтому он слабо типизирован в одном смысле и строго типизирован в другом (нет единого определения), но весь вопрос намного сложнее, чем это. См. wiki.python.org/moin/StrongVsWeakTyping.   -  person Tamas Czinege    schedule 08.01.2010
comment
Я думаю, что это не обман, поскольку это очень специфично для Python. Это не значит, что мы больше не можем задавать языковые вопросы о системе типов, потому что сильная и слабая типизация объяснялась в ответах на другие вопросы. Во-первых, даже если бы это было объяснено там, было бы трудно найти среди всей другой информации.   -  person Maarten Bodewes    schedule 25.06.2016


Ответы (4)


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

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

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

person Anurag    schedule 08.01.2010
comment
неправильно! самая большая проблема php в том, что она слабые типы lang, потому что у вас могут быть скрытые ошибки в коде, такие как неопределенные переменные, функции и т. д. - поддерживать веб-приложение php очень сложно только потому, что по этой причине - person Ben; 22.04.2011
comment
@Yosef Ваш комментарий, кажется, совершенно не связан с этим ответом (который вы ошибочно утверждаете, что это неверно). - person Asad Saeeduddin; 21.03.2014

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

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

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

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

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

person Foppe    schedule 08.01.2010

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

person Ignacio Vazquez-Abrams    schedule 08.01.2010
comment
Интересно - значит, Java будет слабо-типизированной, по крайней мере, в отношении примитивных чисел и строк. - person Kaleb Brasee; 08.01.2010

person    schedule
comment
Я думаю, вы имеете в виду 2, а не «11». - person Ignacio Vazquez-Abrams; 08.01.2010
comment
О, я вижу. Я все перепутал. Если мне нужен статически типизированный язык для Интернета, мне, вероятно, следует выбрать C # или Java. - person confused; 08.01.2010
comment
Что ж, я писал раньше приложение CGI на C ++, но я не рекомендую его. - person Ignacio Vazquez-Abrams; 08.01.2010
comment
запутано: если вам нравится синтаксис Pythons, проверьте язык Boo для платформы CLR. Для JVM Scala предоставляет гораздо больше возможностей для проверки типов и менее подробный код. - person Ants Aasma; 08.01.2010
comment
@confused: Нет. Вам не нужен язык со статической типизацией. Java и C # - это большая головная боль, с которой приходится работать. Вам нужно задать свой реальный вопрос (как отдельный вопрос). Как вы думаете, почему статическая типизация важна? Что вы делаете, из-за чего статическая типизация кажется такой важной? - person S.Lott; 08.01.2010