我突然遇到了这个,我无法理解为什么会发生这种情况!
在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
请帮助我理解。
答案 0 :(得分:9)
**
是正确关联的。在数学上,这是有道理的:3 3 3 等于3 27 ,而不是27 3 。
The documentation表示它是正确关联的:
在功率和一元运算符的未加密码序列中,运算符从右到左进行评估。
答案 1 :(得分:3)
正如the docs所说:
同一个框组中的操作符从左到右(除了比较...和取幂,从右到左分组)。
换句话说,**
是右关联的,而//
(与除比较之外的所有其他运算符一样)是左关联的。
在其他地方,关于The power operator的整个部分,在给出关于权力和一元运算符如何相互作用的规则(这里不相关)之后,澄清了:
[I] n一个不明确的权力和一元运算符序列,运算符从右到左进行评估......
这实际上是大多数编程语言的做法。
在数学中没有使用对称的算子语法编写指数,因此没有理由它应该具有相同的默认关联性。右关联求幂不太有用,因为(2**3)**4
与2**(3*4)
完全相同,而没有什么明显与2**(3**4)
相同。
答案 2 :(得分:1)
**
运算符看起来是右关联的,这意味着3**3**3
评估为3**27
,4**4**4
评估为4**256
。
答案 3 :(得分:1)
当您执行4**4**4
之类的操作时,您应该使用括号来明确您的意图。正如@cHao指出的那样,解析器将解决模糊性,但它让其他人感到困惑。您应该使用(4**4)**4
或4**(4**4)
。这里显而易见的比隐含更好,因为获取权力并不是我们一直看到的工作日操作。