2013-03-14 12 views
10

Qualcuno mi ha appena mostrato questo strano esempio di sintassi python. Perché [4] funziona?Cosa sta succedendo con questa sintassi python? (c == c in s)

mi sarei aspettato di valutare a uno [5] o [6], nessuno dei quali lavora. C'è qualche ottimizzazione prematura in corso qui che non dovrebbe essere?

In [1]: s = 'abcd' 

In [2]: c = 'b' 

In [3]: c in s 
Out[3]: True 

In [4]: c == c in s 
Out[4]: True 

In [5]: True in s 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-5-e00149345694> in <module>() 
----> 1 True in s 

TypeError: 'in <string>' requires string as left operand, not bool 

In [6]: c == True 
Out[6]: False 

risposta

13

Questo è lo stesso zucchero sintattico che consente pitone a catena più operatori (come <) insieme.

Ad esempio:

>>> 0 < 1 < 2 
True 

Ciò equivale a (0<1) and (1<2), con l'eccezione che l'espressione mezzo viene valutato solo una volta.

La dichiarazione c == c in s è analogamente equivalente a (c == c) and (c in s), che restituisce True.

Per evidenziare un punto precedente, l'espressione centrale viene valutata solo una volta:

>>> def foo(x): 
...  print "Called foo(%d)" % x 
...  return x 
... 
>>> print 0 < foo(1) < 2 
Called foo(1) 
True 

Vedere la Python Language Reference per maggiori dettagli.

Problemi correlati