首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Python总是要计算1**4**4**4**4?

为什么Python总是要计算1**4**4**4**4?
EN

Stack Overflow用户
提问于 2014-09-26 01:35:09
回答 5查看 155关注 0票数 1

我在Python2和Python3中都遇到了一个奇怪的问题。

代码语言:javascript
运行
复制
>>> 1**4**4**4
1L
which seems fine, but when I do this:
>>> 1**4**4**4**4

它会占用CPU,而且永远不会结束。

为什么?

我还运行了这些,看看是幂函数,还是**运算符,它似乎只是**运算符。

代码语言:javascript
运行
复制
>>> (((((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时间是怎么回事吗?

关于操作的顺序有没有什么我不理解的不直观的地方?

EN

回答 5

Stack Overflow用户

发布于 2014-09-26 01:38:02

使用**运算符,绑定规则是这样的:在未加括号的表达式中,首先计算右侧。

您的1 ** 4 ** 4 ** 4 ** 4按以下顺序进行评估:

代码语言:javascript
运行
复制
1 ** (4 ** (4 ** (4 ** 4)))

它正在为右侧的巨大数字生成和分配内存,这需要花费大量的时间:

代码语言:javascript
运行
复制
>>> 4 ** 4 ** 4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L
>>> 4 ** 4 ** 4 ** 4
# ... wait a long time as Python allocates GBs of memory ...

引用** documentation

因此,在不带括号的幂运算符和一元运算符序列中,运算符的计算顺序是从右到左

票数 6
EN

Stack Overflow用户

发布于 2014-09-26 01:37:48

从数学上讲,幂运算是右结合的,所以

代码语言:javascript
运行
复制
1**4**4**4**4

不同于

代码语言:javascript
运行
复制
(((((1**4)**4)**4)**4)**4)
票数 2
EN

Stack Overflow用户

发布于 2014-09-26 01:38:08

因为它做不到

代码语言:javascript
运行
复制
(((((1**4)**4)**4)**4)**4)

它正在做的事情

代码语言:javascript
运行
复制
1**(4**(4**(4**(4**4))))

请注意,后者必须计算一个巨大的数字,然后才能简单地将1加到该结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26044728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档