Почему 008 и 009 недопустимы для ключей Python? - PullRequest
13 голосов
/ 14 июня 2009

Почему у меня не может быть 008 или 009, чтобы быть ключом для Python dict, но 001-007 хорошо? Пример:

some_dict = {
    001: "spam",
    002: "eggs",
    003: "foo",
    004: "bar",
    008: "anything", # Throws a SyntaxError
    009: "nothing"   # Throws a SyntaxError
    }

Обновление : проблема решена. Я не знал, что начинание литерала с нуля делает его восьмеричным. Это кажется действительно странным. Почему ноль?

Ответы [ 5 ]

28 голосов
/ 14 июня 2009

В Python и некоторых других языках, если вы начинаете число с 0, число интерпретируется как восьмеричное (основание 8), где только 0-7 являются действительными цифрами. Вам придется изменить свой код на это:

some_dict = { 
    1: "spam",
    2: "eggs",
    3: "foo",
    4: "bar",
    8: "anything",
    9: "nothing" }

Или, если начальные нули действительно важны, используйте строки для ключей.

10 голосов
/ 14 июня 2009

Python принимает восьмеричные числа 008 и 009, поэтому ... неверно.

Вы можете перейти только до 007, тогда следующий номер будет 010 (8), затем 011 (9). Попробуйте это в интерпретаторе Python, и вы поймете, что я имею в виду.

8 голосов
/ 14 июня 2009

В Python (и многих других языках), начиная с числа , ведущий "0" обозначает восьмеричное число (основание 8). Использование этой записи с начальным нулем называется восьмеричным литералом . Восьмеричные числа идут 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 и т. Д. Поэтому 08 (в восьмеричном) недействительно .

Если вы удалите начальные нули, ваш код будет в порядке:

some_dict = 
{ 
    1: "spam",
    2: "eggs",
    3: "foo",
    4: "bar",
    8: "anything",
    9: "nothing" 
}
7 голосов
/ 14 июня 2009

@ DoxaLogos прав. Дело не в том, что это недопустимые ключи - они недопустимые литералы. Если вы попытаетесь использовать их в любом другом контексте, вы получите ту же ошибку.

2 голосов
/ 14 июня 2009

Это потому, что когда вы начинаете число с 0, оно интерпретируется как восьмеричное число. Поскольку 008 и 009 не являются восьмеричными числами, происходит сбой.

A 0 предшествует восьмеричному числу, поэтому вам не нужно писать (127)₈. Со страницы Википедии : "Иногда восьмеричные числа представляются предшествующим значению с 0 (например, в Python 2.x или JavaScript 1.x - хотя в обоих случаях это устарело)."

...