Ich fange gerade mit Python an, das ist wahrscheinlich mein Fehler, aber ...
Ich probiere Python aus. Ich benutze es gerne als Taschenrechner und arbeite langsam an einigen Tutorials.
Ich bin heute auf etwas Seltsames gestoßen. Ich wollte 2013 * 2013 herausfinden, aber ich habe das Falsche geschrieben und 2013 * 013 geschrieben und Folgendes erhalten:
>>> 2013*013
22143
Ich habe mit meinem Taschenrechner nachgesehen und 22143 ist die falsche Antwort! 2013 * 13 soll 26169 sein.
Warum gibt mir Python eine falsche Antwort? Mein alter Casio-Rechner macht das nicht ...
python
python-2.7
math
James Elegan
quelle
quelle
Antworten:
Aufgrund der Oktalarithmetik ist 013 tatsächlich die ganze Zahl 11.
>>> 013 11
Mit einer führenden Null
013
wird als Basis-8-Zahl und 1 * 8 1 + 3 * 8 0 = 11 interpretiert .Hinweis: Dieses Verhalten wurde in Python 3 geändert . Hier ist ein besonders passendes Zitat aus PEP 3127
quelle
0123
Syntax illegal macht und immer erfordert0o123
.0
Präfix gefolgt von 0-8 ist oktal.0x
Präfix gefolgt von 0-9a-f ist hex.0
Präfix , gefolgt von 0- 7 ist Oktal :)013
ist ein oktales Ganzzahlliteral (entspricht dem Dezimal-Ganzzahlliteral11
) aufgrund der führenden 0.>>> 2013*013 22143 >>> 2013*11 22143 >>> 2013*13 26169
Es ist sehr üblich (sicherlich in den meisten Sprachen, mit denen ich vertraut bin), dass oktale Ganzzahlliterale mit
0
und hexadezimale Ganzzahlliterale beginnen0x
. Aufgrund der genauen Verwirrung, die Sie erfahren haben, löst Python 3 einen SyntaxError aus:>>> 2013*013 File "<stdin>", line 1 2013*013 ^ SyntaxError: invalid token
und erfordert entweder
0o
oder0O
stattdessen:>>> 2013*0o13 22143 >>> 2013*0O13 22143
quelle
Pythons 'führende Null'-Syntax für oktale Literale ist ein häufiges Problem:
Python 2.7.3 >>> 010 8
Die Syntax wurde in Python 3.x http://docs.python.org/3.0/whatsnew/3.0.html#integers geändert
quelle
Dies erweitert meistens nur die Antwort von @ Wim ein wenig, aber Python gibt die Basis von Ganzzahlliteralen mit bestimmten Präfixen an. Ohne Präfix werden Ganzzahlen als in Basis 10 interpretiert. Bei einer "0x" wird die Ganzzahl als hexadezimales int interpretiert. Die vollständige Grammatikspezifikation finden Sie hier, obwohl es etwas schwierig zu verstehen ist, wenn Sie mit formalen Grammatiken nicht vertraut sind: http://docs.python.org/2/reference/lexical_analysis.html#integers
Die Tabelle besagt im Wesentlichen, dass Sie, wenn Sie einen langen Wert wünschen (dh einen Wert, der die Kapazität eines normalen int überschreitet), die Zahl gefolgt vom Buchstaben "L" oder "l" schreiben; Wenn Sie möchten, dass Ihre Zahl dezimal interpretiert wird, schreiben Sie die Zahl normal (ohne führende 0). Wenn Sie möchten, dass es oktal interpretiert wird, stellen Sie "0", "0o" oder "0O" voran. Wenn Sie es in hexadezimaler Form möchten, stellen Sie ihm "0x" voran. und wenn Sie es binär wollen, stellen Sie ihm "0b" oder "0B" voran.
quelle
int
(und ich könnte mich tatsächlich irren, wenn es eines gibt) - mein eigenes Gedächtnis reicht so weit zurück, dass es fair ist sicher, dass 2.4 es nicht brauchte. Aber ja, Python 3 lohnt sich im Allgemeinen, wenn Sie nicht auf Bibliotheken angewiesen sind, die noch nicht portiert wurden.