Я пишу какую-то формальную семантику для Python. Надеюсь, что некоторые гуру-питоны могут помочь мне. По мере того, как выполнение программы перемещается вниз по списку операторов, каждый оператор присваивания (или выражение) встречается с ним, он указывает тип на основе контекста. Но он сохраняет этот тип где-то тогда (так что в следующий раз при встречах он может проверить хранилище и проверьте тип), или он выполняет операцию, затем выбрасывает тип, а затем выводит тип снова в следующий раз, когда встречается с переменной? Это для Python 3+ btw (надеюсь, я это сделал)Семантика и состояние Python
ответ
Python использует динамическую типизацию. Тип является частью значения. Везде, где значение идет, его тип идет вместе с ним. (Вы можете получить независимое значение, соответствующее этому типу, с помощью функции type()
.) Тип значения отбрасывается только тогда, когда все значение выбрано. Переменная - это просто ссылка на значение: каждая переменная относится только к одному значению, и вообще это может быть любое возможное значение без ограничений по типу.
Например, в
a = 2
Python не делает a
int
переменной; 2
- это то, что имеет тип int
. a
- это всего лишь ссылка на 2
, которая является целым числом. Когда вы затем написать
b = a + 3
Python получает тип a
, просто получая значение, указанное на a
, а затем получить тип этого. Выражение оценивается и результат сохраняется в b
.
С точки зрения статически типизированного языка, как будто каждая переменная в Python имеет тот же тип значение, при этом каждое имеет значение.
Дополнительную информацию о статической и динамической типизации см. В разделе this other question.
Итак, на Java есть хранилище или состояние, которое знает тип объекта. Поэтому вы не можете сказать «int i = 1 .... i = true», потому что тип i является int ... В Python вы можете это сделать, потому что он будет объявлять переменную. Таким образом, такого состояния нет, из вашего ответа я получаю идею «a = 2» .. 2 хранится в адресе памяти a указывает на. а затем, когда я выполняю операцию над a, он просматривает адрес, см. «a» имеет тип integer, а затем оценивает операцию? –
Правильно, переменные не имеют типов в Python, как в Java. Они также не должны быть объявлены перед установкой. Набор переменных очень похож на «Map
Эта путаница является причиной того, что я предпочитаю термин «имя» над «переменной» в Python. Слово «переменная» заставляет думать, что это нечто, а не ссылка на что-то. –
Что вы подразумеваете под * это указывает тип, основанный на контексте *? – bereal
Хорошо, если есть переменная a .. и инструкция равна a = 2 .. тогда она отображает a типа типа integer .. или если это «a = 2 + 2.2», то по контексту, который он представляет, имеет тип float –
Ну, это не так много, чтобы думать о целочисленном как целое. Это не столько вывод о чем-либо, как то, как целые числа определены в python как это простое определение, как 'int a = 10;', если вы хотите, чтобы это было чем-то отличным от целого, тогда вы должны объявить его точно так же, как на любом другом языке , То, что плавает, целые числа, строки, байты, кортежи, списки, словари и мнимые числа имеют сокращенные объявления – joojaa