为什么这个字典定义会引发语法错误?

1 投票
3 回答
1111 浏览
提问于 2025-04-17 04:29

可能重复的问题:
为什么 lVals = [1, 08, 2011] 会抛出异常?

我正在定义一个字典,用来把日期的数字映射到对应的单词。但是,下面这段代码却出现了“语法错误:无效的标记”,并且把“08”标红了。

days = {01:"first", 02:"second", 03:"third", 04:"fourth", 05:"fifth", 06:"sixth", 07:"seventh", 08:"eighth", 09:"nineth", 10:"tenth", 
    11:"eleventh", 12:"twelvth", 13:"thirteenth", 14:"fourteenth", 15:"fifteenth", 16:"sixteenth", 17:"seventeenth", 18:"eighteenth",
    19:"nineteenth", 20:"twentieth", 21:"twenty-first", 22:"twenty-second", 23:"twenty-third", 24:"twenty-fourth", 25:"twenty-fifth",
    26:"twenty-sixth", 27:"twenty-seventh", 28:"twenty-eighth", 29:"twenty-nineth", 30:"thirtieth", 31:"thirty-first"}

如果把代码修改成让 08 和 09 变成 98 和 99,就不会再出现错误了,像下面的代码:

days = {01:"first", 02:"second", 03:"third", 04:"fourth", 05:"fifth", 06:"sixth", 07:"seventh", 98:"eighth", 99:"nineth", 10:"tenth", 
    11:"eleventh", 12:"twelvth", 13:"thirteenth", 14:"fourteenth", 15:"fifteenth", 16:"sixteenth", 17:"seventeenth", 18:"eighteenth",
    19:"nineteenth", 20:"twentieth", 21:"twenty-first", 22:"twenty-second", 23:"twenty-third", 24:"twenty-fourth", 25:"twenty-fifth",
    26:"twenty-sixth", 27:"twenty-seventh", 28:"twenty-eighth", 29:"twenty-nineth", 30:"thirtieth", 31:"thirty-first"}

这样输出的结果变成了:

{1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'fifth', 6: 'sixth', 7: 'seventh', 10: 'tenth', 11: 'eleventh', 12: 'twelvth', 13: 'thirteenth', 14: 'fourteenth', 15: 'fifteenth', 16: 'sixteenth', 17: 'seventeenth', 18: 'eighteenth', 19: 'nineteenth', 20: 'twentieth', 21: 'twenty-first', 22: 'twenty-second', 23: 'twenty-third', 24: 'twenty-fourth', 25: 'twenty-fifth', 26: 'twenty-sixth', 27: 'twenty-seventh', 28: 'twenty-eighth', 29: 'twenty-nineth', 30: 'thirtieth', 31: 'thirty-first', 98: 'eighth', 99: 'nineth'}

之前出错的键现在都移到了字典的末尾。

非常感谢能看出这里问题的人,

詹姆斯

3 个回答

1

以0开头并且只包含数字的数字会被当作八进制数来理解。八进制数里没有8和9这两个数字。如果你把08和09换成8和9,代码就能正常运行了。

1

在Python中,如果一个数字前面加上一个0,那么这个数字就被认为是八进制数。比如0809会报错,因为在八进制中没有89这两个数字。只要去掉前面的0,就可以正常使用了。

9

在Python中,数字0放在一个整数前面,表示这个数字是八进制数。

...我之前不小心漏掉了这一点,感谢@larsmans在评论中提到,这样的表示方式限制了这个数字只能包含07的数字,89是不可以的。

另外需要注意的是,这种写法是在Python 2.x中使用的,从Python 3.0开始就改了,显然是为了应对你来这里的原因。详细的变化可以在PEP 3127中找到。

最相关的部分是:

几乎所有现在流行的计算机语言,包括C/C++、Java、Perl和JavaScript,都把前面有零的数字当作八进制数。而把这些数字当作十进制数的人也有很合理的观点——[...] 整个非计算机的世界几乎都是在使用十进制数。

撰写回答