每天进步一点点:学习Python 3 的int类型存储长度的问题

今天处理某段代码时,发现要处理vesting_sharesdelegated_vesting_shares的差值,但是这两个值读回来的amount都是字符串。

image.png
(图源 :pixabay)

以我自己的账户为例,读取vesting_sharesdelegated_vesting_shares返回如下:

Reveal spoiler

image.png

Reveal spoiler

image.png

其中amount为整数,表示总数量;precision精度表示精确到小数点后边的位数,也就是amount值的后6位是小数点后的数值。

因为我们处理后还是以上述方式表示,精度也还一样,所以处理加减法只需加减amount的数值即可,但是需要先把字符串型数据转换成数值型数据。

把字符串转换成整数非常简单,var = int(str_val)即可,当我这样做之后,程序运行一如我期望的一样,没出任何BUG。不过我突然想起来好像还有一个long()函数,把字符串转换成长整型,而intlong都是有长度限制的,而vesting_sharesamount值又很大,那么会不会出现超限溢出的问题呢?

Python 3 下 int 类型

当我尝试使用类似这样的方式时,var =long(str_val)时,我被提示如下信息:

NameError: name 'long' is not defined

而当我查看Python 3的内置函数列表时(Built-in Functions),发现long()并不存在:

Reveal spoiler

image.png

而在Built-in Types中,我们会发现,数值类型( Numeric Types)只有intfloatcomplex三种。

那么long哪去了呢?还好在Porting Extension Modules to Python 3:long/int Unification中发现了端倪:

Python 3 has only one integer type, int(). But it actually corresponds to Python 2’s long() type—the int() type used in Python 2 was removed. In the C-API, PyInt_* functions are replaced by their PyLong_* equivalents.

也就是说,Python 3只有一个整数类型:int(),但是其实是对应Python 2中的long()类型,Python 2中原本的int()被移除了

另外,在数值类型( Numeric Types)中有这样一句话:

Integers have unlimited precision

也就是说,Python3中的int类型可以存储无限长度的整数类型(当然了,受限于内存和硬盘的存储空间,不可能真的无限大),所以我根本不用担心之前代码的溢出问题。

Python 2下int类型

另外,特意测试了一下Python 2(Python 2.7.9)下这个问题,发现还挺有意思的。我特意找了个32位的系统,先来用platform.architecture()看一下系统架构:

Reveal spoiler

image.png

然后用sys.maxint看一下最大的整型数据是多少:

Reveal spoiler

image.png

然后做如下测试:

Reveal spoiler

image.png

也就是说,长度不够时,会自动升类型?好神奇。不过我还是用Python3就好,一种类型总比两种类型省心多了。

相关链接

Sort:  

从头读到尾,这个真的感谢分享了。

感谢支持
以前用C,没少遇到溢出的问题
所以不管用啥语言,都习惯性地多想一些😳