Почему Python меняет значение целого числа, когда перед ним стоит 0?

Я реализовал функцию преобразования целочисленного числа в его представление в виде строки intToStr() (код ниже).

Для тестирования я прошел несколько значений и увидел неожиданный результат:

 print intToStr( 1223) # prints 1223 as expected print intToStr(01223) # prints 659, surprisingly 

Теперь я попытался отладить его, и целое число, которое я прошел, действительно оказалось равным 659 .

Почему это происходит и как я могу заставить python игнорировать ведущие нули целочисленного литерала?


Вот код для моей функции:

 def intToStr(i): digits = '0123456789' if i == 0: return 0 result = "" while i > 0: result = digits[i%10] + result i /= 10 return result 

4 Solutions collect form web for “Почему Python меняет значение целого числа, когда перед ним стоит 0?”

Как говорили другие, это из-за восьмеричных чисел. Но я настоятельно рекомендую вам изменить свою функцию на:

 >>> from functools import partial >>> force_decimal = partial(int, base=10) >>> force_decimal("01") 1 >>> force_decimal("0102301") 102301 

Таким образом, вы явно принудительно преобразуете на базу 10. И int не будет выводить ее для вас.

Целочисленный литерал, начинающийся с 0, интерпретируется как восьмеричное число, база 8 :

 >>> 01223 659 

Это было изменено в Python 3, где целые числа с ведущим 0 считаются ошибками:

 >>> 01223 File "<stdin>", line 1 01223 ^ SyntaxError: invalid token >>> 0o1223 659 

Вы никогда не должны указывать целочисленный литерал с ведущими нулями; если вы хотите указать восьмеричное число, используйте 0o для его запуска, иначе разделите эти нули.

Числа, начинающиеся с 0 , интерпретируются как восьмеричные числа . Если он начинается с 0x это шестнадцатеричный десятичный.

Ведущий нуль заставляет Python интерпретировать ваш номер как восьмеричный (base-8).

Чтобы вырезать нули (если num является строкой), выполните:

 num.lstrip("0") 
  • Хороший способ превратить длинные строки в новую строку в Python?
  • overriding bool () для пользовательского класса
  • «Неожиданный EOF при разборе» после утверждения «try»
  • приоритет равенства python
  • Почему __slots__ ведет себя по-другому в Python 2 и 3 при наследовании от абстрактного базового класса
  • Как проверить исключения с помощью doctest в Python 2.x и 3.x?
  • Вложенные аргументы не компилируются
  • Должен ли я использовать «я» для определения переменных / объектов класса instanced, которые мне не нужно будет получать извне?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.