Странное поведение питона - PullRequest
7 голосов
/ 12 мая 2009

Мне было скучно, я играл с консолью 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)

Ответы [ 5 ]

16 голосов
/ 12 мая 2009

Python идет справа налево на математической операции над степенью. Например, IN [2] выполняет:

2 ** (4) = 16

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

Вам понадобится скобка, если вы хотите, чтобы она вычислялась слева направо. Причина, по которой OUT [4] не выводит требуемый ответ, состоит в том, что число является астрономическим, и Python не может его распечатать.

2 ^ 65536 = чрезвычайно огромный

7 голосов
/ 12 мая 2009

Приоритет оператора ** делает оценку идущей справа налево (вместо ожидаемого слева направо). Другими словами:

2**2**2**2 == (2**(2**(2**2)))
4 голосов
/ 13 мая 2009

Как уже говорилось в других ответах, это потому, что ** оценивается справа налево. Вот ссылка для документации , где описаны все приоритеты.

4 голосов
/ 12 мая 2009

Это связано с тем, что порядок приоритета в 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
3 голосов
/ 12 мая 2009

Оценивая справа налево, давайте посмотрим на шаги, которые проходит 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
...