2010-01-06 8 views

Antwort

40

Weil sie Kontrollflusskonstrukte sind. Im Einzelnen:

  • wenn das linke Argument and False ergibt, wird das rechte Argument nicht an allen
  • wenn das linke Argument or wertet True ausgewertet bekommen, das richtige Argument erhält nicht ausgewertet bei Alle

So ist es nicht einfach eine Frage der reservierten Worte. Sie verhalten sich nicht wie Operatoren, da Operatoren immer alle ihre Argumente auswerten.

Sie können dies im Kontrast zu bitweise binäre Operatoren, die, wie der Name schon sagt, sind Operatoren:

>>> 1 | (1/0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 
>>> 1 or (1/0) 
1 

Wie Sie sehen, das bitweise OR (|) wertet beide ihre Argumente. Das Schlüsselwort or bewertet sein rechtes Argument jedoch überhaupt nicht, wenn das linke Argument True ergibt; deshalb wird in der zweiten Anweisung kein ZeroDivisionError ausgelöst.

+12

Beachten Sie, dass '&&' und '||' in C als "Operatoren" bezeichnet werden, obwohl sie kurzgeschlossen sind (nicht die rechte Seite in Abhängigkeit vom Wert der linken Seite auswerten). Ähnlich für einige andere Sprachen. –

+1

Ja, ich stimme zu, dass die Terminologie variieren kann. Der wichtigste Punkt ist jedoch, dass sie grundlegend andere Eigenschaften haben, als Python allgemein Operatoren nennt. –

0

Sie klassifizieren sie als Keywords früher im Dokument.

+3

Wahr, aber das bedeutet eigentlich nichts anderes als dass sie nicht als Variablennamen verwendet werden können. –

+0

Die URL, mit der das OP verknüpft ist, hat mit der lexikalischen Analyse zu tun, und lexikalisch sind sie Schlüsselwörter, keine Operatoren. Wenn die Frage als eine der Syntax formuliert würde, dann würde die Down-Vote Sinn machen. – Jacob

0

Sie sind keywords, weil sie reservierte Bezeichner sind, keine speziellen Token von Symbolen.

0

Sie können nicht neu definiert werden, um typspezifische Operationen zu unterstützen, sodass sie nicht in den Bereich der anderen Operatoren fallen.

+2

Ich vermute, dass deine Kausalität falsch ist. Sie können nicht neu definiert werden, um typspezifische Operationen zu unterstützen, da sie keine Operatoren sind. –

6

Python derzeit nicht bieten keine ‚xxx‘ spezielle Methoden entsprechend dem ‚und‘, ‚oder‘ und ‚nicht‘ Boolesche Operatoren. Im Falle von "und" und "oder" ist der wahrscheinlichste Grund, dass diese Operatoren eine Kurzsummierungssemantik haben, d. H. Der zweite Operand wird nicht ausgewertet, wenn das Ergebnis vom ersten Operanden bestimmt werden kann. Die übliche Technik, spezielle Methoden für diese Operatoren bereitzustellen, würde daher nicht funktionieren.

Quelle: PEP 335

PEP 335 spricht über die Möglichkeit, das Hinzufügen überladbaren Betreiber zu haben, und bespricht dieses Thema ein wenig.