2009-08-21 12 views
4

Python macht String-Multiplikation, wo ich erwarten würde, dass es numerische Multiplikation zu tun, und ich weiß nicht warum.Python String Formatierung und String Multiplikation Oddity

>>> print('%d' % 2 * 4) 
2222 
>>> print('%d' % (2 * 4)) 
8 

Sogar den Typ zu Integer zwingen tut nichts. (Ich weiß, das ist überflüssig, aber es ist ein Idiot-Check für mich:

>>> print('%d' % int(2) * int(4)) 
2222 

Offensichtlich löste ich mein Problem (durch die Klammer tut es), aber was hier los ist, ob dies nur eine Marotte ist ich? Denken Sie daran, das ist in Ordnung, aber ich würde lieber die Logik dahinter verstehen.

Antwort

12

Sie erleben Operator Vorrang.

In Python % hat die gleiche Priorität wie *, so dass sie von links nach rechts gruppieren.

So

print('%d' % 2 * 4) 

ist das gleiche wie,

print(('%d' % 2) * 4) 

Hier ist der Python operator precedence table.

Da es schwierig ist, sich an Vorrangregeln für Operatoren zu erinnern, und die Regeln können subtil sein, ist es oft am besten, beim Klammern mehrerer Operatoren in einem Ausdruck einfach explizite Klammern zu verwenden.

+0

Nicht so elegant, um meine eigene Antwort zu akzeptieren, so Karl bekommt den Scheck für die meisten prägnanten und richtigen Antwort. – Schof

+0

"so, dass sie von links nach rechts gruppieren", und zwar deshalb, weil die Gruppe "*", "%" von Operatoren links-assoziativ ist. "**" Gruppen von rechts nach links – newacct

+0

"Sie haben Vorrang für den Operator." Ist das etwas, um einen Arzt zu sehen? – balpha

2

Ah, ich denke, ich habe es herausgefunden.Nach dem ich die Nachricht geschrieben, natürlich.Es ist eine Reihenfolge der Operationen. Die Zeichenfolge Formatierung wird berechnet, und die resultierende Zeichenfolge wird mit dem letzten Operanden multipliziert.

Wenn ich tippe:

>>> print '%d' % 2 * 4 
2222 

Es stellt sich heraus zu sein, als ob ich den Vorrang auf diese Weise festgelegt hatte:

>>> print ('%d' % 2) * 4 
2222