2013-11-14 14 views
6

Come interpreta Python "'a' in 'abc' è True"? Stavo cercando di valutare i seguenti due espressioni:Strano comportamento di Python 'è' operatore se combinato con 'in'

>>> 'a' in 'abc' is True: 
False 
>>> ('a' in 'abc') is True: 
True 

(lo so "è" parola chiave non dovrebbe generalmente essere utilizzato per confrontare per True, questo è solo un esempio)

+3

Sei * * concatenamento degli operatori. –

risposta

10

Domanda interessante!

Ecco il bytecode da 'a' in 'abc' is True:

>>> import dis 
>>> dis.disassemble((lambda: 'a' in 'abc' is True).func_code) 
2   0 LOAD_CONST    1 ('a') # stack: 'a' 
      3 LOAD_CONST    2 ('abc') # stack: 'a' 'abc' 
      6 DUP_TOP       # stack: 'a' 'abc' 'abc' 
      7 ROT_THREE       # stack: 'abc' 'a' 'abc' 
      8 COMPARE_OP    6 (in) # stack: 'abc' True 
      11 JUMP_IF_FALSE_OR_POP 21   # stack: 'abc' 
      14 LOAD_GLOBAL    0 (True) # stack: 'abc' True 
      17 COMPARE_OP    8 (is) # stack: False 
      20 RETURN_VALUE   
     >> 21 ROT_TWO 
      22 POP_TOP 
      23 RETURN_VALUE      

e confrontarlo con quello di ('a' in 'abc') is True:

>>> import dis 
>>> dis.disassemble((lambda: ('a' in 'abc') is True).func_code) 
1   0 LOAD_CONST    1 ('a') # stack: 'a' 
      3 LOAD_CONST    2 ('abc') # stack: 'a' 'abc' 
      6 COMPARE_OP    6 (in) # stack: True 
      9 LOAD_GLOBAL    0 (True) 
      12 COMPARE_OP    8 (is) 
      15 RETURN_VALUE   

Così sembra che l'espressione 'a' in 'abc' is True valuta come più o meno:

>>> 'a' in 'abc' and 'abc' is True 

E ' sembra che questo sia il risultato del concatenamento dell'operatore: https://stackoverflow.com/a/19751586/71522 - la stessa magia che fa funzionare 1 < 5 < 10 correttamente.

Molto interessante!

(Nota: questo è stato fatto con CPython 2.7.2)

+0

Spiacente, vedi modifica per spiegazione. –

+0

vedi link allegato da Martjin :) – alko

+0

Grande. Non l'ho potuto dedurre dall'output del linguaggio assembly. Grazie – karthikr

Problemi correlati