Hub*_*hen 1 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
Run Code Online (Sandbox Code Playgroud)
它淹没了CPU并且永远不会完成.
为什么?
我也运行这些来查看它是否与power函数,或**运算符,它似乎只是**运算符.
>>> (((((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
Run Code Online (Sandbox Code Playgroud)
我也试过另一种语言,它似乎只是Python.
为什么不能在几微秒内评估这个?有人可以用CPU时间解释它在做什么吗?
对于我不理解的操作顺序,有什么不直观的东西吗?
对于**运算符,绑定规则是这样的:在未表示的表达式中,首先评估右侧.
您1 ** 4 ** 4 ** 4 ** 4的评估顺序如下:
1 ** (4 ** (4 ** (4 ** 4)))
Run Code Online (Sandbox Code Playgroud)
它正在生成和分配右侧巨大数字的内存,这些内存占用了所有时间:
>>> 4 ** 4 ** 4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L
>>> 4 ** 4 ** 4 ** 4
# ... wait a long time as Python allocates GBs of memory ...
Run Code Online (Sandbox Code Playgroud)
引用**文档:
因此,在功率和一元运算符的未表示序列中,运算符从右到左进行评估