2012-10-17 12 views
19

Powiel możliwe:
Order of syntax for using ‘not’ and ‘in’ keywordsCzy "not e in c" różni się od "e not in c" w Pythonie?

My TA twierdzi, że e not in c nie zawsze dają takie same wyniki jak not e in c (nie dał wyjaśnienie dlaczego chociaż). Nigdy osobiście nie widziałem drugiej postaci w czyimś kodzie (z wyjątkiem jego i książek wyjaśniających, że oba są równoważne) i nigdy nie widziałem, żeby te dwie różniły się zachowaniem, więc jestem podejrzliwy wobec tego twierdzenia. Nie znalazłem nic w Google, postanowiłem tu przyjechać.

Tak, czy ktoś ma jakieś informacje na temat każdego przypadku, w którym zachowanie tych dwóch różni się?

+0

Nie ma różnicy w py2k – inspectorG4dget

+0

Czy sugerujesz, że jest taki w Pythonie 3.x? – szablica

+2

Nie wiem o py3k. Wiem, że nie ma różnicy w py2k – inspectorG4dget

Odpowiedz

26

Są dokładnie takie same, jak w rzeczywistości zastosowanie zarówno not in porównania:

In [25]: def func(): 
    'e' not in 'bee' 
    ....:  
    ....:  

In [27]: def func1(): 
    not 'e' in 'bee' 
    ....:  
    ....:  
In [29]: dis.dis(func) 
    2   0 LOAD_CONST    1 ('e') 
       3 LOAD_CONST    2 ('bee') 
       6 COMPARE_OP    7 (not in) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   

In [30]: dis.dis(func1) 
    2   0 LOAD_CONST    1 ('e') 
       3 LOAD_CONST    2 ('bee') 
       6 COMPARE_OP    7 (not in) 
       9 POP_TOP    
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE 
+0

jest to py3k lub python 2? –

+0

@JanusTroelsen to py2k –

+6

@JanusTroelsen Obie, właściwie - na 3, dostaniesz dokładnie to samo wyjście. – phihag

2

Są identyczne. not ma niższy priorytet niż in, więc not x in y jest analizowany jako not (x in y), który zwraca przeciwieństwo in, czyli co robi not in.

+0

jeśli negacja dzieje się osobno, dlaczego odpowiedź Ashwiniego pokazuje, że daje ten sam kod bajtowy? czy to w optymalizacji? –

+0

Nawet jawne dodanie parens nie wpływa na wygenerowany kod bajtowy. Blok kodu nie zostanie jednak sformatowany w komentarzu. Nadal wierzę, że @mipadi oznacza, jak to działa semantycznie, a nie faktyczne wdrożenie. – szablica

+1

@JanusTroelsen: Tak, jak wskazałem, pokazuję semantykę kodu, a nie to, co jest faktycznie generowane (co może być zależne od szczegółów implementacji). – mipadi