2009-06-14 4 views
13

008または009をPythonのdictのキーにすることはできませんが、001-007は問題ありません。 例:008と009はなぜPythonの辞書に無効なキーですか?

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

更新:問題は解決しました。私はゼロでリテラルを始めることはそれを8進数にしたことを知らなかった。それは本当に奇妙に思える。なぜゼロ?

+2

なぜPythonでですか?歴史的な前提(Cがやった)。私はそれがかなり愚かであることに同意するので、なぜそれがCにあったのか分かりません。 – Jacob

+2

ええ、私たちはそれに立ち往生しています。ゼロを持つ必要がある場合は、代わりに文字列にします。辞書は正常に動作します。 –

+0

オクタルリテラルは「o」(すなわちo73)で表されていました。なぜC言語でゼロ(0)に変更されたのか分かりません。 16進数(基数16)はx(または0x)接頭辞または 'h'接尾辞(0x2AE、2AEh)で表されています。そして、いくつかの言語では、接頭辞「b」を使用して2進数を表しています。 –

答えて

28

、(ベース:

あなたが先頭にゼロを削除する場合は、あなたのコードは、罰金になります8)、有効な数字は0-7だけです。

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

また、先頭のゼロが本当に重要な場合は、キーに文字列を使用してください。

+4

私は本当に、本当に –

+0

@Michael ... K&R 8進数のためにその大会(私はそれが彼らだったと仮定)を思い付くていなかったことwishが殺した - K&Rは、選択している場合がありように見えます「0」が、接頭辞フォーム8進数の方が先行するようです。元のBCPL定義に戻しました。彼らはおそらく、レクサーのために「0」を選択しました。 –

+0

それはCの慣習だと私はすべてのことはあまり気にしません。どのような私を気にすることは(直接互換性があるように設計されたものを数えていない)他のCのような言語は、それをコピーしていることです。私は、このコンベンションがPythonに存在することを認識していませんでした。 Ick。 –

10

Pythonは008と009を8進数として扱うため、無効です。

あなたは007までしか行くことができず、次の番号は010(8)、011(9)です。 Pythonインタプリタで試してみると、私の言いたいことが分かります。パイソン(および他の多くの言語)で

8

、先頭の「0」は進数(ベース8)を示すと番号を開始。この先頭ゼロ表記法を使用することは、という8進数のリテラルと呼ばれます。 8進数は0,1,2,3,4,5,6,7,10,11などになりますので、08(8進数)は無効です。あなたは0で番号を開始した場合、数は8進数として解釈されるPythonや他の言語で

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

@DoxaLogosが正しいです。無効なキーではありません。無効なリテラルです。他のコンテキストでそれらを使用しようとすると、同じエラーが発生します。

2

0で番号を開始すると、それは8進数として解釈されるためです。 008009は8進数ではないため、失敗します。

0は、8進数に先行するので、(127)₈と書く必要はありません。 Wikipedia page"時には、8進数は値の前に0(たとえば、Python 2.xやJavaScript 1.xなど)で表されることがありますが、現在は両方で廃止予定です)。

関連する問題