Что такое строгая и динамическая типизация в контексте Python

Ответ

Это две независимые характеристики языка программирования, которые часто путают. Python является языком с динамической, но при этом строгой типизацией.

  1. Динамическая типизация (Dynamic Typing) означает, что тип переменной определяется в момент присваивания значения (во время выполнения), а не при объявлении. Одну и ту же переменную можно связать с объектами разных типов.

    # Тип переменной меняется во время выполнения
    my_variable = 10         # my_variable - это int
    print(type(my_variable))
    
    my_variable = "hello"  # Теперь my_variable - это str
    print(type(my_variable))
  2. Строгая типизация (Strong Typing) означает, что язык не позволяет смешивать в операциях переменные несовместимых типов. Попытка выполнить такую операцию вызовет ошибку.

    # Попытка сложить число и строку вызовет TypeError
    # Это и есть проявление строгой типизации
    try:
        result = 10 + "5"
    except TypeError as e:
        print(f"Ошибка: {e}")
        # Вывод: Ошибка: unsupported operand type(s) for +: 'int' and 'str'

Ключевое отличие: В языках со слабой типизацией (например, JavaScript) интерпретатор попытался бы неявно преобразовать типы, и операция 10 + "5" могла бы вернуть строку "105" или число 15.

Для добавления статической проверки типов в Python используется механизм аннотаций типов (PEP 484) и специальные инструменты, такие как mypy.

Ответ 18+ 🔞

Эй, ты, слушай сюда, я тебе сейчас такую дичь объясню, что ты сам от себя офигеешь! Все эти умники путают два понятия, как кот собаку, а потом сидят и чешут репу. Речь про Python, да.

Вот смотри, есть два термина: динамическая типизация и строгая типизация. Это не одно и то же, это как хуй с винтом — похоже, но суть разная.

Динамическая типизация — это когда язык не парится заранее. Тип переменной определяется не когда ты её написал, а когда в неё что-то сунул. Прямо в момент работы программы. И ты можешь одной и той же переменной давать пинка под зад, меняя её сущность на ходу.

# Сначала это число, ёпта
my_variable = 10
print(type(my_variable))  # <class 'int'>

# А теперь, блядь, это строка! Волшебство, мать его!
my_variable = "hello"
print(type(my_variable))  # <class 'str'>

Видишь? Никаких предупреждений, живём быстро, умираем молодыми. Переменная — это просто имя, которое ты прилепил к чему угодно.

А теперь строгая типизация. Это уже про характер языка. Python — строгий папаша. Он не позволит тебе делать откровенную хуйню, смешивая несовместимые типы. Попробуй сложить число и строку — получишь по ебалу ошибкой.

# Попытка ебашить число со строкой
try:
    result = 10 + "5"  # Что это за пиздец?
except TypeError as e:
    print(f"Ошибка: {e}")
    # Вывод: Ошибка: unsupported operand type(s) for +: 'int' and 'str'

Вот! Он тебе прямо говорит: «Мудак, что ты творишь? Я так не играю». Это и есть строгость. В слаботипизированных языках (эй, JavaScript, я про тебя!) интерпретатор бы сам додумал, преобразовал типы и выдал какую-нибудь дичь вроде "105". А здесь — нет, блядь, сам думай.

Итог, чтобы не ебал мозг: Python — динамический (типы на лету) и строгий (не позволяет ерунду делать). Всё просто, как три копейки.

А если тебе вдруг захотелось статической проверки, как у взрослых дяденек, то есть аннотации типов (PEP 484) и mypy. Но это уже другая история, про контроль и дисциплину.