Was bedeutet "(1,) == 1" in Python?

119

Ich teste die Tupelstruktur und fand es seltsam, wenn ich den ==Operator wie folgt verwende:

>>>  (1,) == 1,
Out: (False,)

Wenn ich diese beiden Ausdrücke einer Variablen zuordne, ist das Ergebnis wahr:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

Diese Frage unterscheidet sich aus meiner Sicht von der Python-Tupel-Regel für die nachfolgende Kommasyntax. Ich frage die Gruppe von Ausdrücken zwischen ==Operator.

Pythoner
quelle
16
Wenn man sich eine frühere Frage des OP vor nur 2 Stunden ansieht, scheint es wunderbar (oder seltsam), dass die unterschiedliche Gestaltung einer Frage zu unterschiedlichen Ergebnissen (und Akzeptanz in der Community) führen kann.
AKS
24
@AKS Dies sind verschiedene Fragen
Kmaork
7
@AKS Obwohl die Fragen hier geringfügig anders sind, stimme ich Ihrem Punkt vollkommen zu. Herdeneffekt alias HNQ.
Wahnsinn
5
@ PythonNewHand In der Tat ist es völlig akzeptabel. Deshalb habe ich hinzugefügt, dass ich eine Frage anders formuliere .
AKS
3
@CiroSantilli figure 文件 六四 事件 法轮功 wie findest du? Ich überflog diese Antworten und sah nichts, was diese besondere Situation abzudecken schien.
Dan Getz

Antworten:

88

Andere Antworten haben Ihnen bereits gezeigt, dass das Verhalten auf der Priorität des Bedieners beruht, wie hier dokumentiert .

Ich werde Ihnen zeigen, wie Sie die Antwort selbst finden, wenn Sie das nächste Mal eine ähnliche Frage haben. Mit dem astModul können Sie dekonstruieren, wie der Ausdruck analysiert wird:

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

Daraus können wir ersehen, dass der Code analysiert wird, wie Tim Peters erklärte :

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])
wim
quelle
1
Ein weiteres nützliches Werkzeug ist dis: In diesem Fall werden zwei LOAD_CONSTmit unterschiedlichen Werten ( (1,)und 1) und einem BUILD_TUPLEOpp-Code angezeigt.
mgilson
153

Dies ist nur die Priorität des Operators. Du zuerst

(1,) == 1,

Gruppen mögen so:

((1,) == 1),

Erstellt also ein Tupel mit einem einzelnen Element aus dem Ergebnis des Vergleichs des Ein-Element-Tupels 1,mit der Ganzzahl 1für Gleichheit. Sie sind nicht gleich, sodass Sie das 1-Tupel False,für ein Ergebnis erhalten.

Tim Peters
quelle
61
Nicht wirklich, aber 1-Tupel haben eine seltsame Syntax. In der Regel würden Sie , wenn zB weit mehr überrascht sein, 1+2, 2==3, 4*7tat nicht Gruppe wie (1+2), (2==3), (4*7). In der Praxis werden 1-Tupel kaum verwendet (auch außerhalb von StackOverflow-Fragen ;-)).
Tim Peters
6
Vielleicht wäre "unerwartet" ein besseres Wort gewesen als "seltsam". Ich habe das Gefühl, ich betrachte eine dieser Zeichnungen, die je nach Perspektive und Fokus zwei Dinge sein können . Der Gleichheitsoperator ist im Vergleich zu den Kommas so groß, dass man sich leicht darauf konzentrieren und davon ausgehen kann, dass das Ergebnis True/ ist False. Jetzt, wo ich verstehe, was passiert, ist es völlig offensichtlich und vernünftig.
skrrgwasme
31
Und jetzt wissen Sie, was das "Zen of Python" bedeutet, indem Sie sagen, dass der eine offensichtliche Weg, dies zu tun, "zunächst nicht offensichtlich sein kann, es sei denn, Sie sind Niederländer" ;-)
Tim Peters
7
Es ist ein bisschen verwirrend, wenn Sie das Dokument lesen und sehen, dass ein Tupel das Komma ist, nicht die Klammern! In dieser Aussage wird das Komma in der rechten Hand nicht als Teil des Tests betrachtet, sondern als Trennzeichen! Unerwartetes Verhalten!
Ikra_5
3
Allgemeine Ratschläge zu Ausdrücken lauten "Verwenden Sie im Zweifelsfall Klammern". Anschließend sollten alle Eintupel in Klammern gesetzt werden, auch wenn sie nicht Teil der Tupelsyntax sind.
Nigel222
12

Wenn Sie das tun

>>> (1,) == 1,

Es wird ein Tupel mit dem Ergebnis erstellt, dass das Tupel (1,) mit einer Ganzzahl verglichen und somit zurückgegeben wirdFalse .

Wenn Sie stattdessen Variablen zuweisen, sind die beiden Tupel gleich miteinander verglichen.

Du kannst es versuchen:

>>> x = 1,
>>> x
(1,)
mng
quelle