无法理解**运算符的行为

时间:2013-02-13 19:07:36

标签: python

我突然遇到了这个,我无法理解为什么会发生这种情况!

在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 个答案:

答案 0 :(得分:9)

**是正确关联的。在数学上,这是有道理的:3 3 3 等于3 27 ,而不是27 3

The documentation表示它是正确关联的:

  

在功率和一元运算符的未加密码序列中,运算符从右到左进行评估。

答案 1 :(得分:3)

正如the docs所说:

  

同一个框组中的操作符从左到右(除了比较...和取幂,从右到左分组)。

换句话说,**是右关联的,而//(与除比较之外的所有其他运算符一样)是左关联的。

在其他地方,关于The power operator的整个部分,在给出关于权力和一元运算符如何相互作用的规则(这里不相关)之后,澄清了:

  

[I] n一个不明确的权力和一元运算符序列,运算符从右到左进行评估......

这实际上是大多数编程语言的做法。

在数学中没有使用对称的算子语法编写指数,因此没有理由它应该具有相同的默认关联性。右关联求幂不太有用,因为(2**3)**42**(3*4)完全相同,而没有什么明显与2**(3**4)相同。

答案 2 :(得分:1)

**运算符看起来是右关联的,这意味着3**3**3评估为3**274**4**4评估为4**256

答案 3 :(得分:1)

当您执行4**4**4之类的操作时,您应该使用括号来明确您的意图。正如@cHao指出的那样,解析器将解决模糊性,但它让其他人感到困惑。您应该使用(4**4)**44**(4**4)。这里显而易见的比隐含更好,因为获取权力并不是我们一直看到的工作日操作。