Почему 008 и 009 недействительные ключи для Python dicts?

Почему я не могу использовать 008 или 009 для ключей Python, но 001-007 в порядке? Пример:

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

В 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" 
}

Ответ 4

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

Ответ 5

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

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