身份运算符可以说是Python七类运算符中最简单的一类了,相比其他六种运算符(赋值、算术、逻辑、比较、成员、位),它也是最容易被人忽略遗忘的那个。
01身份运算符功能
身份运算符的功能是判断两个对象是否同一个,就像在现实生活中判断两个名字是否是同一个人一样,比如你可能听说过“安吉拉北鼻(Angelababy)”和“杨天宝”,她们都是指教主夫人。这便是身份运算符之所以叫身份的原因——每一个对象(比如现实中的人)都有唯一的一个身份。
02身份运算符有哪些
在Python中,身份运算符与成员运算符最为相似,也只有两个,一个是is,一个与is组合的isnot,注意,是isnot,而不是notis,这点与成员运算符的notin顺序不一样。
成员运算符没有innot的用法,下面Python3.10.4的运行效果显示出这种用法是错误的:
而身份运算符没有notis的用法:
03身份运算符运算规则
和成员运算符相似的是,对于相同的操作数,is与isnot的返回值相反,这是可以理解的,因为它们本来就是互逆的一对运算,它们的运算规则如下表所示:
04什么是同一个对象
在现实生活中,判断是否是同一个人是很简单的,因为每个人都有一个唯一的身份证。你不会因为马一龙长得很像马斯克,或者By2的孙涵孙雨是双胞胎就把他(她)们当作同一个人。
同理,也不能因为两个变量的值相同,就认为它们是同一对象:
注:上面是Python3.10.4的实际运行情况,对于不同的数据赋值运算的规则有所不同,见文末。
在Python中,判断两个变量是否是同一个对象的依据是:引用的数据是不是在内存中具有相同的地址。
id函数可以返回变量在内存中的地址,下面的示例能够让大家理解什么才是同一个对象。在下面的第一个示例中,张三和李四的值不同,其内存地址不同,张三不是李四,是很好理解的;在第2个示例中,李四重新赋值与张三一样的值(张三还是原值),虽然值相同,但内存地址不同,所以张三依然不是李四;在最后一个例子中,将张三赋传值给王二,王二则指向了张三在内存中同一个数据,所以这里王二就是张三。
05如何判断两个变量的值是否相同
相比要判断两个变量是否引用的是同一对象,判断两个对象的值是否相同是更常用的功能(这也是身份运算符不受重视的原因,它的应用场景比其他运算符要小),可以使用等于比较运算符==来判断两个变量的值是否相同:
06Python对不同数据的赋值规则
对于一些很简单的数据,Python会在内存中只保留一份数据,多个变量赋值相同时都会指向这个数据。这一点与一般人认为的较大的数据只保留一份的做法正好相反。下面是两个变量赋值1的示例,可以看到内存地址相同:
下面是简单的英文字符串:
但是较大的数字有所不同:
对于汉字就像对待长数字一样,但是它对于有些英文解析就很令人费解(第一个例子中的英文长度比第三个例子中的要长,但是最长的反而和上述示例中较短的一样):
这一点Python2与Python3没有版本差异,以下是Python2.7.16运行结果:
07结语
关于身份运算符的内容就到此结束吧。关于赋值运算符的原理我现在也不太理解,太过高深的东西很难找到资料,这些教程的很多东西都是我自己领悟的。有时自己会有灵光闪现,能想到一些与众不同的东西,不过灵感这种东西也是可遇不可求,如果以后明白了,会在以后教程中写出,因为怕到时时间过了太久,文章早已过了可修改期。以前的很多文章也有一些不足之处,但是不能修改了。有时修改比发布还难通过审核,所以就算了,人生总有遗憾,有时不完美才更显真实。
感谢阅读,下期再见。
08相关内容
Python教程:第20篇成员运算符Python教程:第19篇逻辑运算符Python教程:第18篇算术运算符Python教程:第17篇比较运算符Python教程:第11篇变量赋值#python#