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

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

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

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

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

Мое понимание слабого / строгого контроля типов испорчено?

11
задан Maarten Bodewes 25 June 2016 в 09:36
поделиться

4 ответа

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

41
ответ дан 3 December 2019 в 00:56
поделиться

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

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

the plus adds (math) because the . (dot) используется для конкатенат, поэтому в php

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

What I'm trying to clear is that every weakly typed / dynamic language does with this's own way.

5
ответ дан 3 December 2019 в 00:56
поделиться

Нет никакого реального определения слабого или сильного набора. Все дело в неявном приведении типов и не имеет никакого отношения к статическому/динамическому типу.

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

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

4
ответ дан 3 December 2019 в 00:56
поделиться

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

2
ответ дан 3 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: