Переменные в Python не имеют типов. Это просто имена для ценностей. Разумеется, эти ценности имеют типы, но переменные не заботятся. Так же, как «Джон» может быть именем человека в одном разговоре или для пуделя в другом, a
может быть именем для int
в одной части вашей программы и str
в другой части.
Это часть гораздо большей разницы между переменными в Python и любым языком, из которого вы, вероятно, исходите.
В C++ переменная на самом деле определяет местоположение в памяти, где могут жить значения. Например, и переменная int
имеет 4 байта памяти, а когда вы пишете a = 42
, она копирует число 42 в эти 4 байта.
В Python переменная просто определяет ссылку на значение, которое имеет свою собственную жизнь где-то в куче. Разумеется, для хранения значения все же должен быть тип, но переменная не является хранилищем значения.
(Если C++ действительно ваш самый знакомый язык, это может помочь думать о каждой переменной Python как типа std::shared_ptr<boost::any>
.)
Есть некоторые программы, где будучи в состоянии повторно использовать имена переменных для различных типы полезны, но есть и другие, где это скорее будет ошибкой, чем чем-то преднамеренным. Существуют такие статические анализаторы, как mypy
, которые вы можете использовать для проверки таких ошибок. В большинстве случаев автоматическое определение типа достаточно, чтобы выяснить, какой тип вы хотите, чтобы переменная была, и убедитесь, что вы использовали этот тип последовательно. Когда это не так, PEP 484 (который, вероятно, будет частью Python 3.5 и уже в основном обрабатывается mypy
), стандартизирует способ помочь этим анализаторам, предоставив им явные подсказки типа.
последнее: Если вам интересно, как это работает под одеялом, в Python, пространство имен каждого осциллографа только словарь. Когда вы пишете a = 5
на модульно-глобальном уровне, это похоже на выполнение g['a'] = 5
, где g
- это словарь модуля. Есть несколько сложных бит с локалями и закрытием, но в основном это ключ к тому, как работают переменные.
Похожий вопрос с хорошими ответами http://stackoverflow.com/questions/11007627/python-variable-declaration – Scott
Кстати, это на самом деле не имеет ничего общего с правилами области видимости. Вы только что получили глобальную область (module-). Вы определяете только функции и классы. (Ну, это не _quite_ true, но достаточно близко на данный момент.) – abarnert
Он не дает ошибку, когда той же переменной присваивается строковое значение, потому что Python использует динамическую типизацию. В этом весь смысл. Типы объектов не будут очень динамичными, если вы не сможете их изменить. – TigerhawkT3