2013-03-14 9 views
10

誰かが私にこの奇妙なpython構文の例を教えてくれました。なぜ[4]は働いていますか?このPythonの構文はどうなっていますか? (c == c in s)

私はそれが[5]か[6]のいずれかに評価されると期待していましたが、どちらもうまくいきませんでした。いくつかの未熟な最適化がここで行われるべきではありませんか?

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 

答えて

13

これは、一緒になって(<など)チェーン複数オペレータにパイソンを可能にする同一の糖衣構文です。例えば

>>> 0 < 1 < 2 
True 

これは中間表現は一度だけ評価されることを除いて、(0<1) and (1<2)と等価です。

ステートメントc == c in sは、同様に(c == c) and (c in s)に相当し、Trueと評価されます。以前のポイントを強調するために

は、中央の表現は一度だけ評価されます。

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

は詳細についてはPython Language Referenceを参照してください。

関連する問題