Wenn ich das mache:
>>> False in [False, True]
True
Das kehrt zurück True
. Einfach weil False
ist in der Liste.
Aber wenn ich es mache:
>>> not(True) in [False, True]
False
Das kehrt zurück False
. In der Erwägung not(True)
, dass False
:
>>> not(True)
False
Warum?
python
python-2.7
python-3.x
Texom512
quelle
quelle
not(True) in [False, True]
Antworten:
Operator Vorrang 2.x , 3.x . Der Vorrang von
not
ist niedriger als der vonin
. Es ist also gleichbedeutend mit:Das ist, was du willst:
Wie @Ben betont: Es wird empfohlen, niemals zu schreiben
not(True)
, liebernot True
. Ersteres lässt es wie einen Funktionsaufruf aussehen, währendnot
es sich um einen Operator und nicht um eine Funktion handelt.quelle
not(True)
; bevorzugennot True
. Das erste lässt es wie einen Funktionsaufruf aussehen, von dem Ihre Verwirrung kam; Wennnot
es eine Funktion wäre,not(True) in ...
könnte es unmöglich seinnot ((True) in ...)
. Sie müssen wissen, dass es sich um einen Operator handelt (oder Sie landen in solchen Situationen), daher sollten Sie ihn wie einen Operator schreiben und nicht als Funktion tarnen.a + b*c + d
, es ist sehr schlecht zu schreibena+b * c+d
. Alsonot(True)
ist das auch schlecht.not True
. Schreiben SieFalse
stattdessen.not True
, würden Sie so etwas wie schreiben ,not myfunc(x,y,z)
womyfunc
eine Funktion ist, dass die RenditenTrue
oderFalse
.not x in y
wird bewertet alsx not in y
Sie können genau sehen, was passiert, indem Sie den Code zerlegen. Der erste Fall funktioniert wie erwartet:
Der zweite Fall bewertet
True not in [False, True]
, wasFalse
eindeutig ist:Was Sie stattdessen ausdrücken wollten, war
(not(True)) in [False, True]
, was wie erwartet istTrue
, und Sie können sehen, warum:quelle
dis
aber dies ist eine sehr wertvolle Antwort, weil es zeigt, dass tatsächlichnot in
verwendet wirdVorrang des Bedieners.
in
bindet enger alsnot
, so dass Ihr Ausdruck gleichbedeutend ist mitnot((True) in [False, True])
.quelle
Es geht um die Priorität des Operators (
in
ist stärker alsnot
). Es kann jedoch leicht korrigiert werden, indem an der richtigen Stelle Klammern eingefügt werden:Schreiben:
ist das gleiche wie:
Das sieht aus, ob
True
es in der Liste ist und gibt das "Nicht" des Ergebnisses zurück.quelle
Es wird als ausgewertet
not True in [False, True]
, was zurückgibt,False
weilTrue
in[False, True]
Wenn du es versuchst
Sie erhalten das erwartete Ergebnis.
quelle
Neben den anderen Antworten, bei denen der Vorrang von
not
niedriger ist alsin
, entspricht Ihre Aussage tatsächlich:Beachten Sie jedoch, dass Python zwei Rollen (
precedence
oderchaining
) verwendet, um dies zu trennen , wenn Sie Ihre Bedingung nicht von den anderen trennen. In diesem Fall hat Python Vorrang. Beachten Sie außerdem, dass Sie, wenn Sie eine Bedingung trennen möchten, alle Bedingungen in Klammern setzen müssen, nicht nur das Objekt oder den Wert:Wie bereits erwähnt, gibt es eine weitere Änderung von Python für Operatoren, die verkettet wird :
Basierend auf der Python- Dokumentation :
Das Ergebnis der folgenden Anweisung lautet beispielsweise
False
:Weil Python die Anweisungen wie folgt verkettet:
Welches genau ist
False and True
das?False
.Sie können davon ausgehen, dass das zentrale Objekt von zwei Operationen und anderen Objekten gemeinsam genutzt wird (in diesem Fall False).
Beachten Sie, dass dies auch für alle Vergleiche gilt, einschließlich Mitgliedschaftstests und Identitätsprüfungen, bei denen es sich um folgende Operanden handelt:
Beispiel:
Ein weiteres berühmtes Beispiel ist der Nummernkreis:
das ist gleich:
quelle
Betrachten wir es als eine Überprüfung der Sammlung von Sammlungen:
[False, True]
ist eine Liste, die einige Elemente enthält.Der Ausdruck wird
True in [False, True]
zurückgegebenTrue
, ebensoTrue
wie ein in der Liste enthaltenes Element.Gibt daher
not True in [False, True]
das "boolesche Gegenteil" alsnot
Ergebnis des obigen Ausdrucks an (ohne Klammern, um die Priorität beizubehalten, da esin
eine höhere Priorität als dernot
Operator hat). Dahernot True
wird sich ergebenFalse
.Auf der anderen Seite ist
(not True) in [False, True]
, gleichFalse in [False, True]
, was istTrue
(False
ist in der Liste enthalten).quelle
Um einige der anderen Antworten zu verdeutlichen, ändert das Hinzufügen von Klammern nach einem unären Operator nichts an seiner Priorität.
not(True)
macht nichtnot
fester binden anTrue
. Es ist nur ein redundanter Satz von KlammernTrue
. Es ist ähnlich wie(True) in [True, False]
. Die Klammern machen nichts. Wenn die Bindung enger sein soll, müssen Sie die Klammern um den gesamten Ausdruck setzen, dh sowohl den Operator als auch den Operanden, dh(not True) in [True, False]
.Um dies anders zu sehen, überlegen Sie
**
bindet enger als-
, weshalb Sie das Negativ von zwei Quadraten erhalten, nicht das Quadrat von negativen zwei (was positiv vier wäre).Was wäre, wenn Sie das Quadrat der negativen zwei wollten? Natürlich würden Sie Klammern hinzufügen:
Es ist jedoch nicht vernünftig zu erwarten, dass Folgendes gegeben wird
4
weil
-(2)
ist das gleiche wie-2
. Die Klammern machen absolut nichts.not(True)
ist genau das gleiche.quelle