マイナスはリテラルの一部じゃなくて演算子
二乗したのに符号がマイナスなんだけど「こいつ虚数か?」と思ったら、単純に **
が先に評価されているだけでした。
>>> -1 ** 2 -1 >>> (-1) ** 2 1
よく読むと、チュートリアルにも記載されてるし。
-
よりも**
の方が優先度が高いので、-3**2
は-(3**2)
として解釈され、結果は -9 になる。こういうふうに解釈されないよう(-3)**2
にすると 9 という結果が得られる。Since ** has higher precedence than -, -3**2 will be interpreted as -(3**2) and thus result in -9. To avoid this and get 9, you can use (-3)**2.
https://docs.python.org/3/tutorial/introduction.html#id3
きっとあまりにも間違える人が多いので、わざわざ注意書きしてあるんでしょうね。なんかすいません。
そもそも -
ってリテラルの一部じゃなくて演算子なのね。-1
を ast で分解させるとこの通り。
>>> import ast >>> ast.dump(ast.parse('-1')) 'Module(body=[Expr(value=UnaryOp(op=USub(), operand=Num(n=1)))])'
つまり、こういうことです。
class SmileParty: def __neg__(self): return 'ネガティブから' def __pos__(self): return 'ポジティブに' s = SmileParty() print(-s) print(+s) print('切り替える')