Когда я набираю в python маленькие целые числа с 0 впереди, они дают странные результаты. Почему это?
>>> 011 9 >>> 0100 64 >>> 027 23
Я использую Python 2.7.3. Я тестировал это в Python 3.0, и, по-видимому, теперь это ошибка. Так что это что-то зависящее от версии.
По-видимому, это все еще целые числа:
>>> type(027) <type'int'>
Переведено автоматически
Ответ 1
Это числа, представленные в базе 8 (восьмеричные числа). Несколько примеров:
Python 2 (старый формат)
Примечание: эти формы работают только на Python 2.x.
011 равно 1⋅81 + 1⋅8⁰ = 9,
0100 равно 1⋅82 + 0⋅81 + 0⋅ 8⁰ = 64,
027 равно 2⋅81 + 7⋅8⁰ = 16 + 7 = 23.
Python 3 (новый формат)
В Python 3 нужно использовать 0o вместо просто 0 для обозначения восьмеричной константы, например, 0o11 или 0o27 и т.д. Python версии 2.x >= 2.6 поддерживает как новый, так и старый формат.
0o11 равно 1⋅81 + 1⋅8⁰ = 9,
0o100 равно 1⋅82 + 0⋅81 + 0⋅ 8⁰ = 64,
0o27 равно 2⋅81 + 7⋅8⁰ = 16 + 7 = 23.
Ответ 2
В Python 2 (и еще нескольких языках программирования) они представляют восьмеричные числа.
В Python 3 011 больше не работает, и вы бы использовали 0o11 вместо этого.
В ответ на редактирование: и это обычные целые числа. Они просто задаются другим способом; и они автоматически преобразуются Python во внутреннее целочисленное представление (которое на самом деле является base-2, поэтому оба 9 и 011 внутренне преобразуются в 0b1001).
Ответ 3
Обе версии Python 2 и 3 понимают восьмеричную запись, начинающуюся с '0o' и '0O' (заглавная буква o), поэтому при работе с Python 2.x также используйте if.
В строках чисел используйте только начальные нули.
Вы можете преобразовывать целые числа из любой другой базовой системы с помощью int().
>>> int(0o20)
16
Если вы хотите, чтобы ваш вывод отображался с начальными нулями, то определите его в соответствии с этим ответом: Отображать число с начальными нулями
Если вы когда-нибудь планируете работать с почтовыми индексами, лучше всего рассматривать их как строки во всех отношениях.
Ответ 4
Числа в восьмеричной системе счисления. Другие префиксы - 0x для шестнадцатеричной и 0b для двоичной.