【问题标题】:Strange python behaviour奇怪的蟒蛇行为
【发布时间】:2009-05-12 15:36:58
【问题描述】:

我很无聊,正在玩 ipython 控制台,遇到了以下我不太了解的行为

In [1]: 2**2
Out[1]: 4

In [2]: 2**2**2
Out[2]: 16

In [3]: 2**2**2**2
Out[3]: 65536

In [4]: 2**2**2**2**2 

[4] 的答案是不是 4294967296L,这是一个很长的数字,但我不知道为什么。

可以在这里找到号码:http://pastie.org/475714

(Ubuntu 8.10、python 2.5.2、ipython 0.8.4)
(Mac OS X 10.5.6,Python 2.5.1)

【问题讨论】:

  • 那不是 4294967296L 的数字是什么?
  • 提供了号码链接

标签: python ipython


【解决方案1】:

Python 在数学幂运算上从右到左。例如,IN[2] 正在做:

2**(4) = 16

IN[3] = 2222 = 22**(4) = 2**16 = 65536

如果要从左到右计算,则需要括号。 OUT[4] 没有输出你想要的答案的原因是因为这个数字是天文数字,Python 无法打印出来。

2^65536 = 非常巨大

【讨论】:

    【解决方案2】:

    ** 运算符的优先级使评估从右到左进行(而不是预期的从左到右)。换句话说:

    2**2**2**2 == (2**(2**(2**2)))
    

    【讨论】:

      【解决方案3】:

      这是因为 Python 中的优先顺序导致该等式从右到左进行计算。

      >>> 2**2
      4
      >>> 2**2**2
      16
      >>> 2**(2**2)
      16
      >>> 2**2**2**2
      65536
      >>> 2**2**(2**2)
      65536
      >>> 2**(2**(2**2))
      65536
      >>> 2**2**2**2**2
      57896044618658097711785492504343953926634992332820282019728792003956564819968L
      >>> 2**2**2**(2**2)
      57896044618658097711785492504343953926634992332820282019728792003956564819968L
      >>> 2**2**(2**(2**2))
      57896044618658097711785492504343953926634992332820282019728792003956564819968L
      >>> 2**(2**(2**(2**2)))
      57896044618658097711785492504343953926634992332820282019728792003956564819968L
      >>> 2**255
      57896044618658097711785492504343953926634992332820282019728792003956564819968L
      

      【讨论】:

        【解决方案4】:

        正如其他答案已经说过的那样,这是因为 ** 是从右到左评估的。 这是documentation link,其中描述了所有优先级。

        【讨论】:

        • 想象一下,如果它在另一个方向上被评估 - 我们肯定会期待完全相同的答案,因为原始陈述是对称的。
        • 我不确定我是否理解您的观点。 ** 运算符不是对称的 (2**3 != 3**2)。可以通过放置括号来模拟优先级。因此,如果您以不同的方式放入括号,那么结果通常会有所不同。
        【解决方案5】:

        评估从右到左,让我们看看 Python 为获得这些答案所经历的步骤:

        2**2
        4
        
        2**(2**2)
        2**(4)
        16
        
        2**(2**(2**2))
        2**(2**(4))
        2**(16)
        65536
        
        2**(2**(2**(2**2)))
        2**(2**(2**(4)))
        2**(2**(16))
        2**(65536)
        2.0035299304068464649790723515603e+19728
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          相关资源
          最近更新 更多