2013-06-06 7 views
6
>>> [l for l in range(2,100) if litheor(l)!=l in sieve(100)] 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
>>> 2 in sieve(100) 
True 
>>> litheor(2) 
True 

So litheor(2) ist True und 2 in sieve(100) ist True, so dass die if-Klausel in der Liste Verständnis ist False. Aber warum ist 2 immer noch in der Ausgabe des Listenverständnisses?Python: Irgendwas ist im Listenverständnis falsch gelaufen?

Antwort

11

Ok, zunächst klingt es verrückt, aber:

>>> True != 2 in [2,3,5] 
True 
>>> (True != 2) in [2,3,5] 
False 
>>> True != (2 in [2,3,5]) 
False 

Wenn Sie merken, dass dieses Problem nicht einfach Vorrang ist, an der AST suchen, ist die einzige verbleibende Option:

>>> ast.dump(ast.parse("True != 2 in [2,3,5]")) 
"Module(body=[Expr(value= 
Compare(left=Name(id='True', ctx=Load()), ops=[NotEq(), In()], comparators=[Num(n=2), List(elts=[Num(n=2), Num(n=3), Num(n=5)], ctx=Load())]) 
)])" 

und hier ist ein kleiner Hinweis:

>>> ast.dump(ast.parse("1 < 2 <= 3")) 
'Module(body=[Expr(value= 
Compare(left=Num(n=1), ops=[Lt(), LtE()], comparators=[Num(n=2), Num(n=3)]) 
)])' 

Also, es stellt sich heraus, ist True != 2 in [2,3,5] ähnlich interpretiert zu 1 < 2 <= 3. Und Ihr Ausdruck

litheor(l) != l in sieve(100) 

bedeutet

litheor(l) != l and l in sieve(100) 

die True ist.

+0

Danke. 1 ist jedoch nicht in Sieb (100). Gibt es noch etwas, das schief gelaufen sein könnte? –

+0

@SylvesterVLowell Nun, könnte einer der folgenden sein: 1) 'sieb (100)' enthält nicht nur ganze Zahlen, sondern auch Boolean 'True'; 2) 'litheor (2)' returning '2' anstelle von boolean und' sieb (100) 'mit' 0'. Ich kann keine anderen Optionen sehen. Können Sie uns bitte Ihre Definitionen von 'sieb' und' litheor' zeigen? – kirelagin

+0

@SylvesterVLowell Oh warte ... Du hast Recht ... Das ist total verrückt ... – kirelagin