3

私は突然これに出くわしました、なぜこれが起こっているのか理解できません!

Pythonプロンプトで、**以下のように3以降で演算子を使用すると、間違った結果が得られます。すなわち、

>>> 2**2**2
16
>>> 3**3**3
7625597484987L
>>> 4**4**4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L

それからかっこを使わないといけないと思ったので使ってみたら正しい結果が出ています。

>>>(3**3)**3
19683

しかし、//オペレーターはこの種の操作で正しい結果をサポートし、提供しています。

>>> 4//4//4
0
>>> 40//4//6
1

私が理解するのを手伝ってください。

4

4 に答える 4

9

**右連想です。数学的には、これは理にかなっています。3 33273に等しく、273はありません。

ドキュメントには、それが適切に関連付けられていると記載されています。

括弧で囲まれていないパワー演算子と単項演算子のシーケンスでは、演算子は右から左に評価されます。

于 2013-02-13T19:13:32.203 に答える
3

ドキュメントが言うように:

同じボックス内の演算子は左から右にグループ化されます(比較…および右から左にグループ化されるべき乗を除く)。

つまり、**は右結合ですが、//(比較を除く他のすべての演算子と同様に)左結合です。

他の場所には、パワー演算子と単項演算子がどのように相互作用するかについてのルール(ここでは関係ありません)を与えた後、次のことを明確にするパワー演算子に関するセクション全体があります。

[I]括弧で囲まれていない一連の単項演算子では、演算子は右から左に評価されます…</ p>

これは実際、ほとんどのプログラミング言語が行う方法です。

べき乗は数学の対称演算子構文で書かれていないので、同じデフォルトの結合法則を持つべき理由は実際にはありません。(2**3)**4また、右結合法則のべき乗は、とまったく同じであるため、あまり役に立ち2**(3*4)ませんが、と同じことは明らかではありません2**(3**4)

于 2013-02-13T19:13:49.937 に答える
1

**演算子は右結合であるように見えます。つまり、として3**3**3評価されます。3**274**4**44**256

于 2013-02-13T19:10:15.697 に答える
1

のようなことをするときは4**4**4、意図を明確にするために括弧を使用する必要があります。@cHaoが示したように、パーサーはあいまいさを解決しますが、他の人には混乱を招きます。(4**4)**4またはを使用する必要があります4**(4**4)。ここで明示的なものは暗黙的なものよりも優れています。なぜなら、力の力を取得することは、私たちが常に目にする平日の操作ではないからです。

于 2013-02-13T19:14:08.460 に答える