2013-06-06 41 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 

Więc litheor(2) jest True i 2 in sieve(100) jest True, więc klauzula na liście zrozumienia if jest False. Ale dlaczego 2 wciąż jest w wynikach na zrozumieniu listy?Python: Coś poszło nie tak gdzieś na zrozumieniu listy?

Odpowiedz

11

Ok, najpierw to brzmi absurdalnie, ale:

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

Kiedy zdajesz sobie sprawę, że nie jest to proste pierwszeństwo problem, patrząc na AST jest jedyne opcja:

>>> 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())]) 
)])" 

i tu jest trochę podpowiedź:

>>> 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)]) 
)])' 

Więc, jak się okazuje, jest interpretowany podobny True != 2 in [2,3,5] do 1 < 2 <= 3. A twój wyraz

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

oznacza

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

który True.

+0

Dzięki. 1, jednak nie jest w sicie (100). Czy coś jeszcze mogło pójść nie tak? –

+0

@SylvesterVLowell No cóż, może być jedną z następujących: 1) 'sito (100)' zawierające nie tylko liczby całkowite, ale również boolean 'True'; 2) 'litheor (2)' zwracający '2' zamiast boolean i' sito (100) 'zawierający' 0'. Nie widzę żadnych innych opcji. Czy mógłbyś pokazać nam swoje definicje 'sito' i' litheor'? – kirelagin

+0

@SylvesterVLowell Oh wait ... Masz rację ... To jest całkowicie zwariowane ... – kirelagin