Warum Python nicht ausführen, Typ-Umwandlung bei der Verkettung von Zeichenfolgen?
In Python, der folgende code erzeugt eine Fehlermeldung:
a = 'abc'
b = 1
print(a + b)
(Die Fehlermeldung "TypeError: cannot concatenate 'str' and 'int' objects").
Warum wird der Python-interpreter nicht automatisch versucht, mit Hilfe der str () - Funktion, wenn es trifft auf die Verkettung von diesen Typen?
- "Im Angesicht der Ungewissheit, weigern, der Versuchung zu erraten." (Jemand hatte, es zu sagen.)
- Ja, und warum nicht es versuchen zu konvertieren, 'abc' in int und fügen Sie 1? Äpfel + Bananen gibt Sie was?
- Frucht Salat?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die Konvertierung ist mehrdeutig, weil
+
bedeutet sowohl string-Verkettung und numerische neben. Die folgende Frage wäre gleichermaßen gültig:Genau das ist die loose-Eingabe-problem, das leider betrübt Javascript.
+
in Programmiersprachen. Andere Sprachen verwenden unterschiedliche Operatoren für die addition und die Verkettung; Python hätte das gleiche getan.Gibt es eine große Grad der Mehrdeutigkeit, die mit solchen Operationen. Angenommen, statt:
Es ist nicht klar, ob
a
sollte dazu gezwungen eine Ganzzahl (Ergebnis5
), oder wennb
sollte gezwungen, um einen string (eine Folge in'41'
). Da Typ-Jonglage Regeln sind transitiv, und übergeben Sie einen numerischen string in eine Funktion erwartet zahlen, könnte Sie in Schwierigkeiten bringen, vor allem, da fast alle arithmetischen Operatoren überladen haben Operationen für strings zu.Beispielsweise in Javascript, um sicherzustellen, dass Sie Umgang mit ganzen zahlen und nicht strings, eine gängige Praxis ist, sich zu vermehren eine variable ein; in Python, die Multiplikation operator wiederholt Saiten, so
'41' * 1
ist ein no-op. Es ist wohl besser, frag einfach den Entwickler zu klären.Die kurze Antwort wäre, weil Python ist eine stark typisierte Sprache.
Dies war eine design-Entscheidung von Guido. Es hätte die eine oder andere Weise wirklich, die Verkettung str und int zu str oder int.
Die beste Erklärung ist immer noch der von guido, können Sie es hier
Den anderen Antworten zur Verfügung gestellt haben ziemlich gute Erklärungen, haben aber versäumt zu erwähnen, dass diese Funktion bekannt ist, eine Starke Typisierung. Sprachen, die eine implizite Konvertierungen sind Schwach Typisiert.
Weil Python nicht ausführen, Typ-Umwandlung bei der Verkettung von Zeichenfolgen. Dieses Verhalten ist beabsichtigt, und Sie sollten in der Gewohnheit der explizite Typ-Konvertierungen, wenn Sie brauchen, um zu zwingen, Objekte in strings oder zahlen.
Den code ändern zu:
Und Sie sehen das gewünschte Ergebnis.
Python wäre zu wissen, was in der Zeichenfolge, um es richtig zu tun. Es ist ein Mehrdeutiger Fall: was soll
'5' + 5
generieren? Eine Zahl oder ein string? Das sollte sicherlich ein Fehler ausgelöst. Nun, um zu bestimmen, ob sich diese situation hält, python wäre zu prüfen haben, die Zeichenfolge zu erzählen. Sollte Sie tun, dass jedes mal, wenn Sie versuchen, zu verketten oder fügen Sie zwei Dinge? Besser einfach lassen die Programmierer konvertieren Sie die Zeichenfolge explizit.Generell, implizite Konvertierungen wie, die sind einfach nur verwirrend! Sie sind schwer zu sagen, schwer zu Lesen und schwer zu Debuggen.
Ist das, wie Sie beschlossen, das design der Sprache. Wahrscheinlich der Grund ist, dass die Forderung, explizite Konvertierungen string verringert die Wahrscheinlichkeit, dass unerwünschte Verhalten (z.B. integer-addition, wenn beide Operanden zufällig mit int-Werten statt Zeichenketten).
sagen python, dass die int ist eine Liste, um keine Verwechslungen der ' + ' - operation.
zurück: ['foo', 'bar', 5]