3

我突然遇到了这个,我无法理解为什么会这样!

在 python 提示符下,**从 3 开始使用运算符,如下所示给出错误结果。IE,

>>> 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 3 3等于 3 27,而不是 27 3

该文档指出它是右关联的:

在无括号的幂和一元运算符序列中,运算符的计算顺序是从右到左。

于 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

当你做类似的事情时4**4**4,你应该使用括号来明确你的意图。正如@cHao 所指出的那样,解析器将解决歧义,但这会让其他人感到困惑。您应该使用(4**4)**44**(4**4)。这里的显式比隐式要好,因为获取权力并不是我们经常看到的工作日操作。

于 2013-02-13T19:14:08.460 回答
1

看起来**运算符是右结合的,意思是3**3**3评估 as3**274**4**4as 4**256

于 2013-02-13T19:10:15.697 回答