直接上个栗子
>>>a = 256
>>>b = 256
>>>a is b
True
>>>a == b
True
>>>a=257
>>>b=257
>>>a is b
False
>>>a == b
True
两次执行结果,为什么不相同?
is
运算符检查两个运算对象是否引用自同一对象 (即, 它检查两个对象的内存地址是否相同).==
运算符比较两个运算对象的值是否相等.
因此,无论a, b取何值,只要值相等,结果就为True>>>[] == [] True
为什么a, b>256
时,内存地址不一样?
-
小整数池
在python编程中,为了优化程序的执行效率,python使用了一个叫做小整数对象池的东东。由于程序会频繁使用一些整数,有了这个小整数对象池,就会把小整数常驻内存不会被垃圾回收机制处理,避免了频繁地在内存中创建和销毁整数带来的耗费
小整数对象池,其实就是一个指针数组,该数组的大小为262(257+5),表示的小整数的范围为[-5,257)(包括-5,不包括257),即是说该数组包含了指向这262个小整数的指针 -
因此,只要整数数值在[-5, 257)之间, 内存地址都会相等
>>>a=-5 >>>b=-5 >>>a is b True
-
对于字符串,Python也有类似的机制,可以了解一下
python字符串驻留机制
下面来看个奇怪的栗子
>>>a=300
>>>b=300
>>>a is b
False
>>>c=300;d=300
>>>c is d
True
>>>id(d)
2445157327408
>>>id(c)
2445157327408
变量abcd的数值都超过了257,理论上各自的内存地址不一样,但为什么cd的内存地址一样?
- 当
c
和d
在同一行中被设置为300
时, Python 解释器会创建一个新对象, 然后同时引用第二个变量. 如果你在不同的行上进行, 它就不会 “知道” 已经存在一个300
对象了. - 这是一种特别为交互式环境做的编译器优化. 当你在实时解释器中输入两行的时候, 他们会单独编译, 因此也会单独进行优化. 如果你在 .py 文件中尝试这个例子, 则不会看到相同的行为, 因为文件是一次性编译的