2017-06-29 20 views
25

Przez pomyłkę użyłem więcej niż jednego słowa kluczowego in w wyrażeniu, ale kod nadal działa.Wielokrotne powtórzone słowo kluczowe "w"

Jaki jest sens:

"a" in "bar" in "foo" # in ... ? 

naiwnie myślałem, że jest to równoznaczne z ("a" in "bar") in "foo" lub "a" in ("bar" in "foo") ale nie jest to przypadek, ponieważ oba nie są ważne. Mam ten sam problem w python2 lub 3.

+2

prawdopodobnie ''a' w 'bar' i 'bar' w 'foo'' podążając za podobną logiką jak' x

+1

@ Ev.Kounis: dlaczego? Nie mogę go znaleźć w dokumentacji. A jakie jest znaczenie "" a "w" b "w" c "w" "d" ... "? –

+1

@RuggeroTurra Przez rozszerzenie, to byłoby '(" a "in" b ") i (" b "wc") i ("c" w "d") '. Oraz' "bar" w "a" w "aaa" '* does * oceniają na' Fałsz', więc nie jestem pewien, o co ci chodzi. – jamesdlin

Odpowiedz

40

in uważa operator porównania, a od Python's documentation for them:

Porównania mogą być dowolnie łączone, np x < y <= z jest równoważna x < y and y <= z, oprócz tego, że jest oceniany y tylko jeden raz (ale w obu przypadkach z nie jest w ogóle oceniany, gdy x < y zostanie uznany za fałszywy).

Formalnie, jeśli , b, C, ..., Y, z są wyrażeniami i OP1, OP2, ..., OPN to porównanie operatory, następnie a op1 b op2 c ... y opN z jest równoważne a op1 b and b op2 c and ... y opN z, z tym wyjątkiem, że każde wyrażenie jest oceniane najwyżej jeden raz.

4

Python ocenia od lewej do prawej (można kontrolować przepływ/grupowanie ze wspornikami, tho), a operatory porównania mogą być dowolnie łączone więc wyrazem:

"a" in "bar" in "foo" in "baz" 

Zasadniczo kończy jako:

"a" in "bar" and "bar" in "foo" and "foo" in "baz" 

Która odpowiada False.

+8

gdyby był od lewej do prawej, byłby to znak '((" " "in" bar ") w" foo ") w" baz "' –

+5

Kolejność oceny nie jest istotna dla pytania: – jamesdlin

+0

@jamesdlin - ma znaczenie przy porównywaniu łańcuchów operatora, ponieważ ocena pęka w momencie napotkania fałszywe porównanie - '" f "w" barze "w None' jest całkowicie poprawne, ponieważ pierwsze (porównanie LTR) nie powiedzie się i Python się zepsuje, jednak' 'f" w "foo" w None "spowoduje" TypeError ". – zwer

1

Wydaje się następujące znaczenie:

("a" in "bar") and ("bar" in "foo") - lub False

Poniższy może pomóc:

  • "a" in "bar" in "foo" =>False
  • "a" in "bar" in "foobar" =>True
  • "b" in "bar" in "foobar" = >True
  • "c" in "bar" in "foobar" =>False

Myślałem najpierw, że to mogło być "a" in ("bar" in "foo"), ale to oczywiście wróci następujące:

TypeError: argument of type 'bool' is not iterable

ponieważ ("bar" in "foo") powraca False

Edycja Naprawiono oczywiste literówki

+3

'" b "w" bar "w" foo "' => 'Fałsz'. Powinien być "Fałszywy", a nie "Prawdziwy". – xiaoyi

+9

Czy jest dodatkowe "in" po "i" w pierwszej linii kodu? – Angew

+0

Przeprosiny, miały tam kilka literówek - powinny mieć sens teraz :) –