2016-04-28 5 views
0

Я пишу какую-то формальную семантику для Python. Надеюсь, что некоторые гуру-питоны могут помочь мне. По мере того, как выполнение программы перемещается вниз по списку операторов, каждый оператор присваивания (или выражение) встречается с ним, он указывает тип на основе контекста. Но он сохраняет этот тип где-то тогда (так что в следующий раз при встречах он может проверить хранилище и проверьте тип), или он выполняет операцию, затем выбрасывает тип, а затем выводит тип снова в следующий раз, когда встречается с переменной? Это для Python 3+ btw (надеюсь, я это сделал)Семантика и состояние Python

+3

Что вы подразумеваете под * это указывает тип, основанный на контексте *? – bereal

+0

Хорошо, если есть переменная a .. и инструкция равна a = 2 .. тогда она отображает a типа типа integer .. или если это «a = 2 + 2.2», то по контексту, который он представляет, имеет тип float –

+0

Ну, это не так много, чтобы думать о целочисленном как целое. Это не столько вывод о чем-либо, как то, как целые числа определены в python как это простое определение, как 'int a = 10;', если вы хотите, чтобы это было чем-то отличным от целого, тогда вы должны объявить его точно так же, как на любом другом языке , То, что плавает, целые числа, строки, байты, кортежи, списки, словари и мнимые числа имеют сокращенные объявления – joojaa

ответ

1

Python использует динамическую типизацию. Тип является частью значения. Везде, где значение идет, его тип идет вместе с ним. (Вы можете получить независимое значение, соответствующее этому типу, с помощью функции type().) Тип значения отбрасывается только тогда, когда все значение выбрано. Переменная - это просто ссылка на значение: каждая переменная относится только к одному значению, и вообще это может быть любое возможное значение без ограничений по типу.

Например, в

a = 2 

Python не делает aint переменной; 2 - это то, что имеет тип int. a - это всего лишь ссылка на 2, которая является целым числом. Когда вы затем написать

b = a + 3 

Python получает тип a, просто получая значение, указанное на a, а затем получить тип этого. Выражение оценивается и результат сохраняется в b.

С точки зрения статически типизированного языка, как будто каждая переменная в Python имеет тот же тип значение, при этом каждое имеет значение.

Дополнительную информацию о статической и динамической типизации см. В разделе this other question.

+0

Итак, на Java есть хранилище или состояние, которое знает тип объекта. Поэтому вы не можете сказать «int i = 1 .... i = true», потому что тип i является int ... В Python вы можете это сделать, потому что он будет объявлять переменную. Таким образом, такого состояния нет, из вашего ответа я получаю идею «a = 2» .. 2 хранится в адресе памяти a указывает на. а затем, когда я выполняю операцию над a, он просматривает адрес, см. «a» имеет тип integer, а затем оценивает операцию? –

+0

Правильно, переменные не имеют типов в Python, как в Java. Они также не должны быть объявлены перед установкой. Набор переменных очень похож на «Map » на Java. (Фактически вы можете получить значение, очень похожее на эту карту, вызывая 'vars()'.) –

+0

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