2015-05-10 1 views
3

Я начинаю программировать на python, и я написал следующую программу, чтобы понять правила определения области охвата и ввода текста.правила определения области и набора текста в python

a = 5                                                 
    print(a) 
    a = "Hello World" 
    print(a) 

Я получаю следующий выход.

5 
    Hello World 

Я понимаю, что переменные динамически типизируются в python. Интерпретатор понимает, что «a» является целым числом, когда происходит назначение a=5. Почему это не дает ошибку, когда той же переменной присваивается строковое значение

+0

Похожий вопрос с хорошими ответами http://stackoverflow.com/questions/11007627/python-variable-declaration – Scott

+0

Кстати, это на самом деле не имеет ничего общего с правилами области видимости. Вы только что получили глобальную область (module-). Вы определяете только функции и классы. (Ну, это не _quite_ true, но достаточно близко на данный момент.) – abarnert

+0

Он не дает ошибку, когда той же переменной присваивается строковое значение, потому что Python использует динамическую типизацию. В этом весь смысл. Типы объектов не будут очень динамичными, если вы не сможете их изменить. – TigerhawkT3

ответ

9

Переменные в 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 - это словарь модуля. Есть несколько сложных бит с локалями и закрытием, но в основном это ключ к тому, как работают переменные.

5

Переменные не имеют типов в Python. Объекты имеют типы. «Переменные» - это просто имена, прикрепленные к объектам. В вашем примере имя a - это всего лишь метка. Вы можете прикрепить его к любому объекту.

0

позволяет взять программу по строчке и что происходит ..

линия 1 - вставить значение 5 и назначить его на этикетке называется «»

линия 2 - напечатать этикетку «а»

линия 3 - вставить значение, называемое «привет мир» и назначить его для обозначения «а» и метку «а» в настоящее время указал на значение «привет мир» вместо значения 5.

линия 4 - напечатать этикетку «а»

хороший способ понять питона интерпретация использует визуализатор. вот одно хорошее онлайн-приложение. это дает вам идею поэтапного выполнения программы. link to visualizer

Смежные вопросы