Ответ 1
Когда Python выполняет файл script, сначала обрабатывается весь файл. Вы можете заметить, что когда вы вводите синтаксическую ошибку где-то: независимо от того, где она находится, это предотвратит выполнение любой строки.
Итак, поскольку Python сначала анализирует файл, литералы могут быть загружены эффективно в память. Поскольку Python знает, что они являются постоянными, все переменные, которые представляют эти постоянные значения, могут указывать на один и тот же объект в памяти. Таким образом, объект является общим.
Это работает для int и floats, но даже для строк; даже если есть постоянное выражение, которое необходимо оценить сначала:
a = "foo"
b = "foo"
c = "fo" + "o"
print(a is b)
print(a is c)
Теперь в IDLE поведение совсем другое: в качестве интерактивного интерпретатора IDLE выполняет каждую строку отдельно. Таким образом, a = 1.1
и b = 1.1
выполняются в разделенных контекстах, что делает невозможным (или просто очень сложно) понять, что они оба имеют одно и то же значение константного литерала и могут совместно использовать память. Поэтому вместо этого интерпретатор будет выделять два разных объекта, что приведет к сбою проверки идентификатора с помощью is
.
Для небольших целых чисел ситуация немного отличается. Поскольку они часто используются, CPython сохраняет набор целых чисел (в диапазоне от -5 до 256) статически и делает каждое значение этих точек одним и тем же объектом int
. Вот почему вы получаете другой результат для небольших целых чисел, чем для любого другого объекта. См. Также следующие вопросы: