Что означают цифры, начинающиеся с 0 в python?

Когда я набираю маленькие целые числа с 0 впереди в python, они дают странные результаты. Почему это?

>>> 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*(8**1) + 1*(8**0) = 9,

0100 равно 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

027 равно 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

Python 3 (новый формат)

В Python 3 нужно использовать 0o вместо просто 0 для указания восьмеричной константы, например 0o11 или 0o27 и т.д. Версии Python 2.x> = 2.6 поддерживают как новый, так и старый формат.

0o11 равно 1*(8**1) + 1*(8**0) = 9,

0o100 равно 1*(8**2) + 0*(8**1) + 0*(8**0) = 64,

0o27 равно 2*(8**1) + 7*(8**0) = 16 + 7 = 23.

Ответ 2

В Python 2 (и еще нескольких языках программирования) они представляют восьмеричные числа.

В Python 3, 011 больше не работает, и вместо этого вы использовали бы 0o11.

В ответ на редактирование: и они являются регулярными целыми числами. Они просто различаются по-разному; и они автоматически преобразуются Python во внутреннее целочисленное представление (которое фактически является базовым 2, поэтому оба 9 и 011 внутренне преобразованы в 0b1001).

Ответ 3

Обе версии Python 2 и 3 понимают восьмеричную запись с ведущими "0o" и "0O" (Uppercase o), поэтому привыкайте, если при работе с Python 2.x.

Используйте только начальные нули в числах в строках.

Вы можете преобразовать целые числа из любой из базовых систем с помощью int().

>>> int(0o20)

16

Если вы хотите, чтобы ваш вывод отображался с ведущими нулями, определите его для этого ответа: Отобразить номер с ведущими нулями

Если вы когда-либо планируете работать с ZIP-кодами, лучше всего рассматривать их как строки во всех отношениях.

Ответ 4

Числа в восьмеричной числовой системе. Другие префиксы 0x для шестнадцатеричных и 0b для двоичных файлов.

Ответ 5

Это восьмеричные числа (база 8, значения 0 - 7)

Вы можете преобразовать десятичное число в восьмеричное с помощью функции oct().

In [125]: for i in range(10):
   .....:     print '{:5} {:5}'.format(i, oct(i))
   .....:
    0 0
    1 01
    2 02
    3 03
    4 04
    5 05
    6 06
    7 07
    8 010
    9 011

и преобразовать восьмеричное значение в целое число с функцией int() с соответствующей базой (в этом случае 8):

int(str(17), 8)
Out[129]: 15

Аналогичный набор правил/функций применяется для шестнадцатеричных чисел (база 16) с использованием функции hex().

Ответ 6

Это очень легко. Это восьмеричные числа.

http://en.wikipedia.org/wiki/Octal

Также есть числа, начинающиеся с 0x. Это шестнадцатеричные числа:

>>> 0x51
81

Ответ 7

Они, по-видимому, восьмеричные (базовые 8) числа, а 0 - просто устаревший префикс, используемый Python 2.

В Python 3 вы должны написать вместо 0o11.

Они по-прежнему являются целыми числами, но операции с ними дадут результат в виде обычной базы-10.

Ответ 8

Я попробовал. Я узнал немного. Из Java я знаю это как ловушку: ведущий ноль вводит восьмеричное число. У меня есть коллеги, которые не соответствовали. не знаю, что после более чем лет с опытом работы на Java.

Теперь мне было интересно, что такое поведение на Python. Я ценю это изменение от Python 2 до Python 3. Это ошибка, я никогда не понимал, почему Java (молодой язык с фокусом "легко") может взять на себя это глупое решение от C.

Прецизионный префикс может быть случайно напечатан (плохое решение). 0x для шестнадцатеричного числа никогда не вводится случайно (хорошее решение). Но 0 и o аналогичны, поэтому я думаю, что 0o23 в Python не является идеальным решением. 0c23 (o c tal) было бы лучшим решением, на мой взгляд.

Ответ 9

Последняя спецификация Python для числовых литералов находится в PEP-3127 "Целочисленная литеральная поддержка и синтаксис"

Синтаксис для 011 был удален в Python 3.0. Синтаксис для 0o11 был добавлен в Python 2.6, и он поддерживается только после Python 3.0. В Python 2 нет импорта __future__, который запретил бы или по крайней мере предупреждал бы о __future__ литералах с ведущими нулями, поэтому разработчики должны знать, что означает 011, и что его следует избегать (и этого фактически можно избежать).