python中的 is 和 ==
一前言
环境:win10 python3.10
二 is 和 is not
1 比较对象的identity
is 和 is not 是python的比较运算符,比较运算符除了这两个,还有下图中的这些
is 和 is not 比较的是两个对象的是 identity
identity是啥,内置函数id()返回的就是这个东西
通过上面id函数的解释,现在知道,identity就是对象在内存中内存地址(就cpython而言,也就是我们现在用的python)
在python中万物皆对象,每个对象都存放于内存中的某个特定的地方,这个地方在内存中用内存地址来表示。is 和is not 比较的就是两个变量指向的对象是否是同一个对象
2 特殊情况下的identity
我们知道,同一个类的的不同实例对象,虽然属于同一个类型,但却是不同的对象
比如我们的自定义类,同一个类的不同实例对象
比如我们定义的字符串,自定义的字符串虽然不需要像其它自定义类那样去实例化类来得到一个字符串对象,但这些字符串都属于python内置的str类型,都属于str对象(即字符串),且是不同的对象,哪怕是定义两个内容完全相同的字符串,他们也不是同一个对象
上面说的在大部分情况下是成立的,但对于少部分情况(如少部分整数和短字符串等),只要内容相同,他们就是同一个对象
这是何故?,这是python为了提高性能,对于部分对象,只要内容相同,在内存中只保留一个对象,也称为intern机制。也就说,对于这部分对象,只要内容相同,不同变量指向的都是同一个对象
这些满足instern机制的特殊对象有
- None
- True
- False
- 数字-5 to 256
- 由数字 字母和下划线组成的字符串
- 不满足inster()机制的字符串,在由instern()函数转化而得到的字符串
如
三 == 与 !=
这两个比较运算符是判断两个对象的内容是否相同,并不是判断是否是同一个对象
注意,判断一个对象的值是否为None,通常是用 is,而不是==
四 总结
在判断是否属于同一个对象时用is和is not,一些满足intern机制的对象的比较结果是反常识的
在比较对象的的内容是否相同时用==或!=