疯狂的Python-07(特殊的数字们)
一些有趣的鲜为人知的Python特性集合
无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!
阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲
▶ 特殊的数字们
下面这个例子在网上非常的流行。
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
:bulb: 解释:
is
和==
的区别
-
is
操作符会检查两边的操作数是否引用的是同一个对象(也就是说,会检查两个操作数的id号是否匹配)。 -
==
操作符会比较两个操作数的值是否一样。 - 所以说
is
是比较引用地址是否相同,==
是比较值是否相同。下面的例子解释的比较清楚,>>> [] == [] True >>> [] is [] # 这里的两个空list分配了不同的内存地址 False
256
是一个已经存在于内存的对象 但是 257
不是
当你启动一个Python解释器的时候,数字-5
到256
就会自动加载进内存。 这些数字都是一些比较常用的数字,所以Python解释器会把他们提前准备好以备以后使用。
下面这段话摘抄自 https://docs.python.org/3/c-api/long.html (已经翻译为中文)
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behavior of Python, in this case, is undefined.:-)
当前的实现方法是,维护一个从-5到256的整数数组,当你使用其中某一个数字的时候,系统会自动为你引用到已经存在的对象上去。我认为应该让它可以改变数字1的值。不过就现在来说,Python还没有这个功能。:-)
>>> id(256)
10922528
>>> a = 256
>>> b = 256
>>> id(a)
10922528
>>> id(b)
10922528
>>> id(257)
140084850247312
>>> x = 257
>>> y = 257
>>> id(x)
140084850247440
>>> id(y)
140084850247344
Python解释器在执行y = 257
的时候还不能意识到我们之前已经创建过了一个值为257
的对象,所以它又在内存创建了一个新的对象。
当a
和b
变量在同一行赋值并且所赋值相等时,它们会引用到同一个对象
>>> a, b = 257, 257
>>> id(a)
140640774013296
>>> id(b)
140640774013296
>>> a = 257
>>> b = 257
>>> id(a)
140640774013392
>>> id(b)
140640774013488
- 当a和b在同一行被赋值为
257
的时候, Python解释器会创建一个新的对象,然后把这两个变量同时引用到这个新的对象。如果你分开两行赋值两个变量,那么解释器不会“知道”之前自己已经创建过一个同样的257
对象了。 - 这是一种专门针对交互式解释器环境的优化机制。 当你在控制面板中敲入两行命令的时候,这两行命令是分开编译的,所以他们也会单独进行优化。如果你准备把这个例子(两行分别赋值的例子)写进
.py
文件然后进行测试,那么你会发现结果跟写在一行是一样的,因为文件里的代码是一次性编译的。