78

Pythonを始めたばかりなので、これはおそらく私の間違いですが...

私はPythonを試しています。私はそれを計算機として使用するのが好きで、いくつかのチュートリアルをゆっくりと進めています。

今日、変なことに遭遇しました。2013*2013 を調べたかったのですが、間違ったことを書いて 2013*013 と書いたところ、次のようになりました。

>>> 2013*013
22143

電卓で調べたところ、22143 は間違った答えです。2013 * 13 は 26169 のはずです。

Python が間違った答えを返すのはなぜですか? 私の古いカシオの電卓はこれをしません...

4

4 に答える 4

137

8 進数であるため、013 は実際には整数の 11 です。

>>> 013
11

先頭にゼロがある場合、 0138 進数として解釈され、1*8 1 + 3*8 0 = 11 となります。

注: この動作はpython 3 で変更されましたこれはPEP 3127からの特に適切な引用です

整数のデフォルトの 8 進数表現は、C のような言語に慣れていない人にとっては、黙って混乱を招くものです。Python 言語自体にとって '013' は '10 進数の 13' ではなく '10 進数の 11' を意味し、ほとんどの人間がこのリテラルに割り当てる意味ではないため、間違った値で整数オブジェクトを誤って作成することは非常に簡単です。 .

于 2013-04-09T05:47:41.670 に答える
36

01311先頭に 0 があるため、8 進整数リテラル (10 進整数リテラルと同等) です。

>>> 2013*013
22143
>>> 2013*11
22143
>>> 2013*13
26169

08 進整数リテラルが で始まり、16 進整数リテラルが で始まることは非常に一般的です (確かに、私がよく知っているほとんどの言語で) 0x。あなたが経験した正確な混乱のために、Python 3 は SyntaxError を発生させます:

>>> 2013*013
  File "<stdin>", line 1
    2013*013
           ^
SyntaxError: invalid token

0oまたは0O代わりに次のいずれかが必要です。

>>> 2013*0o13
22143
>>> 2013*0O13
22143 
于 2013-04-09T05:52:22.703 に答える
5

これはほとんど@Wimの答えを少し拡張しただけですが、Pythonは特定のプレフィックスを使用して整数リテラルのベースを示しています。プレフィックスがない場合、整数は base-10 として解釈されます。「0x」を指定すると、整数は 16 進数の int として解釈されます。完全な文法仕様はここにありますが、正式な文法に慣れていないと理解するのは少し難しいです: http://docs.python.org/2/reference/lexical_analysis.html#integers

この表は基本的に、long 値 (つまり、通常の int の容量を超える値) が必要な場合は、数字の後に文字 "L" または "l" を書くことを示しています。数値を 10 進数で解釈する場合は、数値を通常どおり (先頭に 0 を付けずに) 書きます。8 進数で解釈する場合は、先頭に「0」、「0o」、または「0O」を付けます。16 進数が必要な場合は、先頭に「0x」を付けます。バイナリで表示する場合は、先頭に「0b」または「0B」を付けます。

于 2013-04-09T06:01:16.227 に答える