在python 3中对整数进行加电

时间:2018-09-02 11:14:20

标签: python

尝试在Python 3.6.5中计算长整数的幂,并且我得到0。这是预期的行为吗?然后它与官方文档矛盾。

lambda_handler

3 个答案:

答案 0 :(得分:0)

仅当i不是int时,才会发生这种情况。通过运行以下命令可以找到i的类型:

print(type(i))


在Python中,可以定义一个看起来像int的类,并定义自己的__pow__()方法。因此,如果没有更多细节,很难知道发生了什么。

我已经能够通过以下方式重现类似的行为:

import numpy as np
i = np.int64(4294967296)
print (i**2)

但它还会显示警告:

__main__:3: RuntimeWarning: overflow encountered in long_scalars

这种行为在numpy中是正常的,因为它使用溢出语义定义了一个有限的整数类型。 np.int64只有64位,而指数运算的高位被简单地丢弃。由于4294967296 = 2 32 ,因此(2 32 2 太大,无法容纳64位。由于唯一的非零位是太高的64位,因此在溢出后只剩下零位。这对于numpy整数类型是正常的。


当我尝试online python时,numpy.int64溢出时甚至没有警告。

答案 1 :(得分:0)

鉴于所提供的信息很少,重现此行为的唯一方法是创建一个覆盖__pow__方法的自定义类。
例如,

>>> class myInt(int):
...     def __pow__(self,x):
...             return 0
... 
>>> i = myInt(16777216)
>>> i
16777216
>>> i**2
0
>>> float(i)**2
281474976710656.0

答案 2 :(得分:0)

也许这个问题可以解决。实际上,我上面的变量不是Python int类型。这是解释。

df = df['count'].unstack([2,3], fill_value=0).sort_index(axis=1)
print (df)
param1       0     1  2
param2       a  x  d  a
user1 user2            
2     6      0  1  0  0
4     13     0  0  0  3
21    76     2  0  1  0