Когда я набираю маленькие целые числа с 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, и что его следует избегать (и этого фактически можно избежать).