python - 为什么 Python 需要永远评估 1**4**4**4**4?

标签 python operators exponentiation

我在 Python 2 和 Python 3 中都遇到了一个奇怪的问题。

>>> 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 时间上的作用吗?

是否有我不理解的关于操作顺序的不直观的东西?

最佳答案

对于 ** 运算符,绑定(bind)规则是这样的:在未加括号的表达式中,首先计算右侧

您的 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 ...

引用** documentation :

Thus, in an unparenthesized sequence of power and unary operators, the operators are evaluated from right to left

关于python - 为什么 Python 需要永远评估 1**4**4**4**4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044728/

相关文章:

python3.8在mac上尝试git commit到bitbucket时没有这样的文件或目录

python - 即使在重新启动 mac 终端后,我的 .bash_profile 更改也没有发生,我该怎么办?

python - 将 Django 注释指向特定对象

python - 对矩阵本身求幂 N 次?

algorithm - 2的幂得到一个整数

assembly - 无法弄清楚程序集 x86 中的 printf 函数以及使用操作数

python - 为什么 round(5/2) 返回 2?

c++ - 如何从派生类访问基类中的重载运算符?

C运算符命令

c++ - 这个运算符(operator)的名字是什么->*?