我在Python2和Python3中都遇到了一个奇怪的问题。
>>> 1**4**4**4
1L
which seems fine, but when I do this:
>>> 1**4**4**4**4
它会占用CPU,而且永远不会结束。
为什么?
我还运行了这些,看看是幂函数,还是**运算符,它似乎只是**运算符。
>>> (((((1**4)**4)**4)**4)**4)
1
>>> pow(pow(pow(pow(pow(pow(1,4),4),4),4),4),4)
1
>>> pow(pow(pow(pow(pow(pow(1.0,4),4),4),4),4),4)
1.0
>>> pow(pow(pow(pow(pow(pow(1L,4),4),4),4),4),4)
1L
>>> 1L**4**4**4
1L
我还尝试了另一种语言,它似乎只是Python。
为什么它不能以微秒为单位进行计算呢?有人能解释一下CPU时间是怎么回事吗?
关于操作的顺序有没有什么我不理解的不直观的地方?
发布于 2014-09-26 01:38:02
使用**
运算符,绑定规则是这样的:在未加括号的表达式中,首先计算右侧。
您的1 ** 4 ** 4 ** 4 ** 4
按以下顺序进行评估:
1 ** (4 ** (4 ** (4 ** 4)))
它正在为右侧的巨大数字生成和分配内存,这需要花费大量的时间:
>>> 4 ** 4 ** 4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L
>>> 4 ** 4 ** 4 ** 4
# ... wait a long time as Python allocates GBs of memory ...
因此,在不带括号的幂运算符和一元运算符序列中,运算符的计算顺序是从右到左
发布于 2014-09-26 01:37:48
从数学上讲,幂运算是右结合的,所以
1**4**4**4**4
不同于
(((((1**4)**4)**4)**4)**4)
发布于 2014-09-26 01:38:08
因为它做不到
(((((1**4)**4)**4)**4)**4)
它正在做的事情
1**(4**(4**(4**(4**4))))
请注意,后者必须计算一个巨大的数字,然后才能简单地将1加到该结果。
https://stackoverflow.com/questions/26044728
复制相似问题