龙空技术网

原因找到了!是Python对整数常量的优化 #计算机

Crossin的编程教室 44

前言:

当前咱们对“python限定变量为整数”大体比较重视,各位老铁们都需要剖析一些“python限定变量为整数”的相关知识。那么小编同时在网摘上搜集了一些关于“python限定变量为整数””的相关文章,希望小伙伴们能喜欢,同学们一起来了解一下吧!

Python编程:整数缓存优化orBug?

昨天的视频我们演示了Python中is的奇葩特性,相信不少小伙伴都看蒙圈了,今天我就来解释一下背后的原因,其实是Python解释器的三个优化操作。

·首先是小整数池。Python为了优化速度,在每次执行代码时会提前把-5到256的整数创建好,因为这些小整数是会被经常用到的。而当你创建一个值在这个范围内的整数时,就不是再临时去创建一个对象,而是直接指向已经建好的对象。所以不管你有多少个变量,实际都是同一个对象。

我们可以用id函数来验证这一点。而对于小数没有这样的优化,因为小数实在太多了,大于256的整数也没有。那为什么写在py文件里的大整数就是相同的呢?这就要说到Python的另一个优化大整数缓存。尽管对于大于256的整数不会提前创建好,但如果Python解释器发现你用到重复的整数常量,也会将后面的变量指向已经创建好的对象。

所以不仅是在py文件中,即使在交互环境下,如果把两个大整数的赋值写在同一行,或者放在一个代码块中,也会发现它们是相同的。但这种优化仅限于数值常量,对于带有变量的计算就不起作用了。因为Python无法提前预判变量的值,而对于不带变量的纯数值计算,Python又做了一次优化,常量折叠。

Python在编译阶段会把常量表达式计算成结果并替换,所以不管你是10乘以100还是10的3次方,又或者是111乘以9加1对Python来说都是1000,于是也同样被缓存了。以上这些就是is会呈现出看似混乱结果的原因。

但请注意,这些解释器的优化并不是Python语言层面的特性,它们可能因环境和版本的不同而产生不同的结果。比如在Python3.7中,不同作用域的大整数,不会被缓存为同一个对象,但在Python3.11中却是相同的。作为开发者来说最好的选择就是不要在比较数值相等时使用is。只有一种情况建议用is而不是==,就是判断一个值是否为空值None。你知道为什么吗?

标签: #python限定变量为整数