Почему 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 - хотя в настоящее время он устарел и в том и в другом).