Как Python отличает Int от Double - PullRequest
       24

Как Python отличает Int от Double

0 голосов
/ 30 октября 2018

Итак, в нашем слайде лекций по сборке мы имели:

Типы данных языка высокого уровня C, A и B определяют правильный схема из нескольких вариантов (целое число, с плавающей запятой), чтобы использовать для выполнить операцию «+»

Теперь в таких языках, как Python, я не указываю тип переменной. Мне было интересно, как язык компилирует (интерпретирует, я думаю, это то, что он делает) в сборку и выбирает правильную схему?

Спасибо

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Каждая переменная Python является ссылкой на объект. Этот объект включает информацию о типе переменной. Например, просто просмотрите несколько возможностей, поскольку мы неоднократно переназначаем значение и тип x «на лету»:

for x in [1, 1.0, "1", [1]]:
    print(x, type(x))

Выход:

1 <class 'int'>
1.0 <class 'float'>
1 <class 'str'>
[1] <class 'list'>

Если вам интересно, как Python может определить, что 1 - это целое число, а 1.0 - это число с плавающей запятой, это очевидно из входной строки. Языковой процессор обычно содержит токенизатор, который может различать языковые токены, и другой модуль, который интерпретирует эти токены в синтаксисе языка. Объекты int и float имеют разные форматы токенов ... как и строки, знаки пунктуации, идентификаторы и любые другие элементы языка.

Если вы хотите узнать больше об этом уровне детализации, изучите, как анализировать компьютерный язык: большинство методов применимы к большинству языков.

0 голосов
/ 30 октября 2018

как н.м. под вашим постом прокомментированы, переменные не имеют типа в Python. Значения делают.

Насколько определяется целое число против числа с плавающей запятой при вводе следующего:

x = 1.5
y = 2

Это определяется на этапе анализа. Скомпилированные и интерпретированные языки фактически начинаются одинаково.

Общий поток при отправке кода интерпретатору / компилятору выглядит следующим образом:

[source code] --> lexical analyzer --> [tokens] --> parser --> [abstract syntax tree] -->

Шаг синтаксического анализа проверяет токены, такие как 'x' '=' '1.5', и ищет шаблоны, которые указывают на различные типы литералов, таких как int, float и string. К тому времени, когда фактический интерпретатор / компилятор получает абстрактное синтаксическое дерево (древовидное представление вашей программы), он уже знает, что значение, хранящееся в x (1.5), является плавающей точкой.

Так что, для ясности, эта часть процесса концептуально одинакова для интерпретаторов и компиляторов.

0 голосов
/ 30 октября 2018

На уровне интерпретатора довольно легко определить разницу между целым числом (34), числом с плавающей запятой (34.24) и строкой («Тридцать четыре»). Полный список типов можно увидеть на https://docs.python.org/3/library/stdtypes.html.

Как только тип известен, легко определить, какая операция необходима. Отдельная функция (__add__) определена для каждого класса, и интерпретатор (написанный на C для стандартного Python) выполнит арифметику. C набран, и компилятору (сравнительно) легко преобразовать его в машинный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...