Python сильный / слабый динамический / статический язык типов?

Я узнал, что Python является сильно-динамическим типизированным языком.
динамический: тип переменной определяется во время выполнения, а НЕ во время компиляции. В этой части я могу понять, что тип определяется, когда значение (тип курса) назначается переменной.

сильный: вы не можете изменить тип переменной. Но это не настоящий случай:

>>> a = 1
>>> type(a)
<type 'int'>
>>> a = 's'
>>> type(a)
<type 'str'> 

Из приведенного выше кода я могу изменить тип переменной a с int на str.
Как это может случиться? Могу ли я сказать, что Python является языком со слабой типизацией?


РЕДАКТИРОВАТЬ:

Если вы можете дать мне фрагмент кода, который показывает, как сильнодинамическая типизация влияет на программирование на Python, я был бы очень признателен! Во время моего обычного кодирования меня никогда не беспокоили проблемы с сильной динамической типизацией. Это редко влияет на мою функцию кода. Weird!


РЕДАКТИРОВАТЬ:
Вывод из ответов:

  1. Только объект / значение имеет атрибут type. Переменная не имеет типа.
  2. (Сильный) Тип определяет, какие операции могут выполняться над / между объектами / значениями (возможно, переменные ссылаются на них).
  3. (Динамический) Тип означает переменную просто метка (ссылка на объект / значение). Эта метка может ссылаться на любой объект / значение любого типа.

4 ответа

Решение

Ключ в том, что объект сохраняет свой тип независимо от того, что вы с ним делаете. Int является int является int; ул есть ул; поплавок это поплавок. На слабо типизированном языке вы можете сделать что-то вроде

i = "1" 
j = i + 2

и получить J == 3. В Python, вы получаете

TypeError: cannot concatenate 'str' and 'int' objects

Str всегда является str и не может рассматриваться как int, даже если строка содержит число.

Попробуй это:

for a in {1, 'abc', 3.14159}:
    print a
    print type(a)

который будет производить

3.14159
<type 'float'>
1
<type 'int'>
abc
<type 'str'>

Одна переменная может быть установлена ​​для ссылки на любой тип объекта - это его "динамическая" часть. Но объект всегда имеет один и тот же тип, независимо от того, как вы к нему относитесь - это его "сильная" часть.

Когда вы переназначаете новое значение переменной, я бы не сказал, что это "та же самая" переменная, поскольку ее идентификатор изменится. Посмотрите на этот пример:

a = 1
print id(a)
a = 2
print id(a)
a = "asd"
print id(a)

печатает в моей машине:

30925512
30925488
37467840

это значит a больше не тот же объект. Из документов Python:

id (объект) Возвращает "идентичность" объекта. Это целое число (или длинное целое число), которое гарантированно будет уникальным и постоянным для этого объекта в течение срока его службы.

Вы не меняете тип переменной так сильно, как переназначение a который был int теперь совершенно новой переменной с тем же именем, которая является str

Было бы точнее сказать, что Python строго типизирован, потому что вы не можете изменить тип объекта. Переменные Python несколько отличаются от переменных во многих других языках, потому что они являются не чем иным, как именами, указывающими на объекты. Сами имена не содержат информации о типах, только объекты.

На языке со слабой типизацией, таком как JavaScript, вы можете сделать что-то вроде 1 == "1" и получить истинный результат, или сделать 3 - "2" и получить 1, потому что объекты неявно приводят между целым числом и строкой; тип объекта не является "частью его идентичности", и объекты ведут себя как разные типы в зависимости от контекста. В Python вы не можете делать такие вещи; если вы хотите, чтобы один тип действовал как другой, вам нужно создать новый объект нового типа, потому что тип объекта присущи этому объекту.

Другие вопросы по тегам