Короткий ответ: максимального значения у целых чисел в Python нет. Тип int имеет произвольную точность и растет, пока хватает памяти, поэтому 2 ** 200 или факториал тысячи это обычные числа, а не переполнение. Константа sys.maxsize, которую часто принимают за предел, ограничивает не значения, а размеры: это максимум для длины списка, длины строки и индексов в них, на 64-битных системах он равен 9223372036854775807.
Кратко
- У типа
intв Python нет максимального значения: число растет, пока хватает памяти, и тихого переполнения, как у целых типов Java, не бывает. sys.maxsizeэто максимальное значение типаPy_ssize_t: 9223372036854775807, то есть2 ** 63 - 1на 64-битных системах и2 ** 31 - 1на 32-битных.- Ограничивает он длину списка, длину строки и индексы в них, а не значения чисел:
sys.maxsize + 1спокойно вычисляется и остается обычнымint. - В Python 2 была константа
sys.maxint, в Python 3 ее убрали именно потому, что предела у целых чисел больше нет. - Если нужно «заведомо большое» начальное значение для поиска минимума, берут
math.inf, а неsys.maxsize. - Единственные реальные ограничения у больших чисел это память и лимит на перевод числа в строку: с Python 3.11 он равен 4300 цифрам и снимается вызовом
sys.set_int_max_str_digits().
Введение в максимальное целое число в Python
В Python, в отличие от Java, целые числа не ограничены фиксированной шириной бита. Это означает, что Python может работать с произвольно большими целыми числами, если для их поддержки достаточно памяти. Прямого аналога Integer.MAX_VALUE из примитивных типов Java в Python нет: похожая по звучанию константа sys.maxsize ограничивает не значения чисел, а размеры структур данных.
Целые числа в Python
Целые числа в Python имеют произвольную точность, что позволяет использовать широкий диапазон значений: отдельного «длинного» типа, как в Python 2, больше нет, есть только int. Атрибут sys.maxsize указывает максимальное значение переменной типа Py_ssize_t, которое она может принимать. Это предел не для значений, а для размеров: длины списка, длины строки и индексов в них. Документация описывает sys.maxsize как целое число, которое больше любого практического индекса списка или строки. Само значение легко превысить: sys.maxsize + 1 вычисляется без ошибок и остается обычным int.
| Тип | Диапазон значений | Что при выходе за границу |
|---|---|---|
Java int |
от -2147483648 до 2147483647 | тихое переполнение: Integer.MAX_VALUE + 1 дает Integer.MIN_VALUE |
Java long |
от -9223372036854775808 до 9223372036854775807 | такое же тихое переполнение |
Java BigInteger |
ограничен памятью | переполнения нет, число просто растет |
Python int |
ограничен памятью | переполнения нет, число просто растет |
Отсюда и разница в привычках: в Java за границами типа следят, а в Python следят за памятью и за скоростью, потому что арифметика с очень большими числами заметно медленнее.
Зачем использовать sys.maxsize в Python?
Использование sys.maxsize может быть полезно, когда вам нужно установить большое число в качестве порогового или начального значения, и вы хотите избежать жесткого кодирования конкретного большого числа. Правда, для «заведомо большого» порога в современном Python чаще берут math.inf: оно больше любого целого числа, и намерение читается сразу. sys.maxsize остается уместным там, где значение обязано остаться именно целым, например как заглушка для индекса или размера.
Пример использования в Python
import sys
def demonstrate_maxsize():
max_number = sys.maxsize
print("Max number:", max_number)
number1 = max_number - 1
print("Number1:", number1)
if number1 < max_number:
print("Number1 is less than max_number")
if __name__ == "__main__":
demonstrate_maxsize()
Вывод программы
Max number: 9223372036854775807
Number1: 9223372036854775806
Number1 is less than max_number
Подробное объяснение
Max number: sys.maxsize дает максимальное значение типа Py_ssize_t: на 64-битной системе это 9223372036854775807, то есть 2 ** 63 - 1.
Number1: Присвоение значения на единицу меньше, чем sys.maxsize.
Сравнение: Проверяется, меньше ли Number1, чем max_number.
Проверим: предела действительно нет
Раз sys.maxsize ограничивает не значения, это несложно показать в коде. Прибавим к нему единицу и заодно посмотрим на число из двухсот двоичных разрядов.
import sys
print('sys.maxsize =', sys.maxsize)
# Число больше sys.maxsize это обычное целое, а не переполнение
big = sys.maxsize + 1
print('sys.maxsize + 1 =', big, '| тип:', type(big).__name__)
# Длина числа ограничена только памятью
huge = 2 ** 200
print('2 ** 200 =', huge)
print('двоичных разрядов:', huge.bit_length(), '| байт в памяти:', sys.getsizeof(huge))
Вывод программы
sys.maxsize = 9223372036854775807
sys.maxsize + 1 = 9223372036854775808 | тип: int
2 ** 200 = 1606938044258990275541962092341162602522202993782792835301376
двоичных разрядов: 201 | байт в памяти: 52
Ни ошибки, ни ухода в минус: sys.maxsize + 1 остается обычным int. Видна и цена произвольной точности: 2 ** 200 занимает 52 байта против 28 у нуля, и чем длиннее число, тем медленнее с ним арифметика. Но это память и скорость, а не предел значения.
Единственный жесткий лимит: 4300 цифр
С Python 3.11 у больших чисел появилось ограничение, о котором обычно узнают неожиданно: перевод из числа в строку и обратно ограничен 4300 цифрами. Само число при этом считается нормально, а вот напечатать его не получится.
import math
import sys
number = math.factorial(2000)
print('двоичных разрядов:', number.bit_length())
try:
print('цифр в числе:', len(str(number)))
except ValueError as error:
print('ошибка:', error)
sys.set_int_max_str_digits(0)
print('цифр в числе:', len(str(number)))
Вывод программы
двоичных разрядов: 19053
ошибка: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
цифр в числе: 5736
Ограничение придумали как защиту: перевод в десятичную запись нельзя выполнить за линейное время, и на гигантском числе он занимает секунды, чем можно подвесить сервис (документация ссылается на CVE 2020-10735). Поэтому лимит касается только десятичной системы, а hex(), oct() и bin() работают без ограничений. Снять или изменить его можно вызовом sys.set_int_max_str_digits(), ключом запуска -X int_max_str_digits=0 или переменной окружения PYTHONINTMAXSTRDIGITS. Текущее значение показывает sys.get_int_max_str_digits(), а минимально допустимое, кроме нуля, равно 640.
Вывод
Понимание и использование sys.maxsize в Python полезно для различных приложений, где вам нужно очень большое целочисленное значение. Практикуясь на приведенных примерах, вы сможете улучшить свои навыки кодирования и применить полученные знания для решения реальных задач. Продолжайте экспериментировать и учиться! Не стесняйтесь обращаться к этому руководству, когда вам понадобится дополнительная информация. Счастливого кодинга!
Вопросы и ответы
Какое максимальное значение int в Python?
Его нет. В Python 3 целые числа имеют произвольную точность: число занимает столько памяти, сколько нужно, и растет, пока памяти хватает. Поэтому 2 ** 200 или факториал тысячи вычисляются без всяких хитростей. За максимум часто ошибочно принимают sys.maxsize, но это предел длины контейнеров, а не значений.
Что такое sys.maxsize и чему он равен?
Это максимальное значение переменной типа Py_ssize_t, которым в CPython измеряются размеры и индексы. На 64-битных системах он равен 9223372036854775807 (2 ** 63 - 1), на 32-битных 2147483647 (2 ** 31 - 1). Практический смысл такой: список или строка длиннее sys.maxsize невозможны, а вот число больше sys.maxsize абсолютно нормально.
Почему в Python 3 нет sys.maxint?
Константу убрали в Python 3.0 вместе с делением на int и long. В списке изменений Python 3.0 это сказано прямо: sys.maxint удалили, поскольку у значения целых чисел больше нет предела, а sys.maxsize можно использовать как число, которое больше любого практического индекса списка или строки. Обращение к sys.maxint в Python 3 даст AttributeError.
Как задать заведомо большое начальное значение для поиска минимума?
Для этого есть math.inf (то же самое, что float('inf')): оно больше любого целого числа, поэтому первое же сравнение сработает. Учтите, что это значение типа float, и превратить его обратно в целое нельзя: int(math.inf) выбросит OverflowError. Если результат обязан остаться целым, sys.maxsize подойдет, но только как договоренность, а не как настоящий предел.
Есть ли вообще предел у больших чисел в Python?
Есть два. Первый это память: очень длинное число просто не поместится. Второй появился в Python 3.11, и о нем часто узнают неожиданно: перевод числа в строку и обратно ограничен 4300 цифрами. Например, str(math.factorial(2000)) выбросит ValueError, хотя сам факториал (5736 цифр) уже посчитан. Лимит снимается вызовом sys.set_int_max_str_digits(0), он защищает от зависаний на разборе гигантских чисел.
Чем int в Python отличается от int в Java?
В Java int это 4 байта фиксированной ширины, и при выходе за границу значение молча уходит в минус. В Python int хранит столько разрядов, сколько нужно, и ближе не к int, а к BigInteger. Расплата это память и скорость: под ноль в Python уходит 28 байт, под 2 ** 1000 уже 160 байт, а операции с длинными числами идут медленнее машинной арифметики.
Читайте также:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ