is和==运算符

is:同一性运算符

看如下例子:

a=b=[1,2,3]
c=[1,2,3]
print(a==b)
print(a==c)
print(a is b)
print(a is c)
#输出
True
True
True
False

可见,is运算符用于判定同一性,而不是相等性,变量a和b被绑定在同一个列表上,而变量c被绑定在另一个具有相同数值和顺序的列表上,它们的值可能相等,但不是同一个对象,从内存的角度思考,就是它们所指向的内存空间不一样,a和b指向同一块内存空间,而c指向另一块内存空间。由此可见,is 运算符用来判定两个对象是否为同一对象,==判断两个对象是否相等。

再看这个例子:

>>> a=b=5
>>> c=5
>>> a is b
True
>>> a is c
True

>>> x=y=500
>>> z=500
>>> x is y
True
>>> x is z
False

明明a和c不再同一块内存中,为什么a is b返回的是True呢,这是Python的垃圾回收机制造成的,python内部有一个叫小整数对象池的东西,为了优化速度,Python会把[-5,256]之间的小整数提前存放在小整数对象池中,当程序中要用到这个区间中的数时,都会指向这个对象池中的同一块数据,不会再重新申请一块内存。当超出这个区间的数时,就会重新申请一块内存,所以当当为500时,x is y返回False。

注意:这个现象只有在命令行中输入时有效,当在pycharm中运行或者保存成文件执行时都时返回True,具体原因待查。

猜你喜欢

转载自www.cnblogs.com/cjluchen/p/8963432.html