Warum ist 'a' in ('abc') wahr, während 'a' in ['abc'] falsch ist?

72

Bei Verwendung des Interpreters gibt der Ausdruck 'a' in ('abc')True und 'a' in ['abc']False zurück. Kann jemand dieses Verhalten erklären?

Immer
quelle
40
('abc')ist kein Tupel, es ist nur die Zeichenfolge 'abc'. 'abc'Verwenden Sie, um die Mitgliedschaft in einem Tupel mit der Zeichenfolge tatsächlich zu überprüfen a in ('abc',).
Dano
13
Das liegt an der doppelten Verwendung von Klammern für die Priorität von Ausdrücken und für Tupel, was zu dieser seltsamen Syntax für Einzelelement-Tupel führt
njzk2
2
Die Klammern ('abc')dienen nur zur Dekoration und können zu Verwirrung führen. Ich brauchte eine Weile, um darüber hinwegzukommen. Ich dachte auch, dass die Klammern etwas Besonderes anzeigen (vgl. Quadratische Klammern oder geschweifte Klammern, die etwas Besonderes bedeuten). In dieser Verwendung haben diese Klammern keine Bedeutung. Es gibt keinen Unterschied zwischen xyz = (x, y, z)und xyz = x, y, z. Es ist das Vorhandensein eines Kommas, das eine besondere Bedeutung hat (außer im Fall eines leeren Tupels, wo ()es eine besondere Bedeutung hat).
David Hammen
3
Sie können natürlich, geben Sie einfach 'abc', ('abc')und ['abc']in den Interpreter, und sehen , was das meint sie sind.
Nutzlos

Antworten:

136

('abc')ist das gleiche wie 'abc'. 'abc'enthält 'a'daher den Teilstring 'a' in 'abc' == True.

Wenn Sie stattdessen das Tupel möchten, müssen Sie schreiben ('abc', ).

['abc']ist eine Liste (enthält ein einzelnes Element, die Zeichenfolge 'abc'). 'a'ist kein Mitglied dieser Liste, also'a' in ['abc'] == False

dhke
quelle
49

('abc')ist kein Tupel. Ich denke, Sie haben das mit Tupel verwechselt ('abc',).

Tatsächlich ('abc')ist es dasselbe wie 'abc', array of characterswo sich ein aZeichen befindet, daher gibt die erste Suche Folgendes zurück True:

>>> 'a' in 'abc'
True

Auf der anderen Seite ['abc']handelt es sich um eine Liste von Zeichenfolgen oder eine Liste von Zeichen (Sie können sich das als 2D-Zeichenmatrix vorstellen [['a', 'b', 'c']]), wobei aals einzelnes Zeichen nicht das Mitglied der äußeren Liste ist. Tatsächlich ist es das erste Zeichen der inneren Liste:

>>> 'a' in ['abc']
False

>>> 'a' in ['abc'][0]
True

>>> 'a' == ['abc'][0][0]
True
Ozgur
quelle
Können Sie mir bitte sagen und / oder einen Hinweis auf die Bedeutung dieses hinzufügen'a' == ['abc'][0][0]
Ahmed
'a' == ['abc'] [0] [0] "a" ist in (Liste erstes Element> erstes
Zeichen
2
Mit anderen Worten, sobald das erste [0]angewendet wird, bleibt Ihnen etwas übrig 'a' == 'abc'[0](es gibt das erste Element der Liste an), und nach dem Anwenden des zweiten [0]bleibt Ihnen etwas übrig 'a' == 'a', das ausgewertet wird True.
Carcigenicate
2
@ Ahmed ['abc'][0]gibt dir 'abc'. 'abc'[0]gibt dir 'a'.
Ozgur
3

Denn ('abc')du bekommst 'a' als ('abc')Gegenleistung wahr.

Da ['abc']es sich jedoch um eine Array-Liste handelt, erhalten Sie 'a' als ['abc']Gegenleistung false.

Beispiel:

Eingang: ('abc') == 'abc'

Ausgabe: True

Wenn wir also 'a' in ('abc') nennen, ist es dasselbe wie 'a' in 'abc', weil ('abc') kein Tupel ist, sondern 'abc' ein Zeichenfeld, in dem sich das Zeichen 'a' befindet Index 0 der Zeichenfolge 'abc'.

Andererseits ist ['abc'] eine Array-Liste, wobei 'abc' eine einzelne Zeichenfolge ist, die sich am Index 0 des Arrays ['abc'] befindet.

Tupple Beispiel: x = ('abc', 'def', 'mnop')

Array-Beispiel: x = ['abc', 'def', 'mnop']

oder

x = ('abc'), y = 'abc'

Hier immer x == y.

Aber im Falle von 'a' in ['abc']=>

x = ['abc'], y = 'abc'

Hier x != yaberx[0] == y

MAK Ripon
quelle
2

Wie andere schon erwähnt haben, ('abc')ist kein Tupel. 'a'ist kein Element von ['abc']. Das einzige Element in dieser Liste ist'abc'

x='abc' in ['abc']

print (x)

True #This will evaluate to true

Dies wird auch als wahr bewertet:

y = 'a' in ['a','b','c']

print (y)

True
dyao
quelle
0

('abc')ist äquivalent zu 'abc'.

'a' in ('abc')ist äquivalent zu 'a' in 'abc'.

'a' in ('abc', )gibt Falseals zurück 'a' in ['abc'].

'a' in ['a', 'b', 'c']gibt Trueals zurück 'a' in 'abc'.

Sevenforce
quelle