sna*_*ile 12 python comparison equality
我注意到我可以使用==运算符来比较所有本机数据类型(整数,字符串,布尔值,浮点数等)以及包含本机数据类型的列表,元组,集和字典.在这些情况下,==操作员检查两个对象是否相等.但在其他一些情况下(尝试比较我创建的类的实例),==运算符只检查两个变量是否引用相同的对象(因此在这些情况下,==运算符等同于is运算符)
我的问题是:==运营商什么时候做的不仅仅是比较身份?
编辑:我正在使用Python 3
Dir*_*irk 20
在Python中,==运算符是根据魔术方法__eq__实现的,默认情况下通过身份比较来实现.但是,您可以覆盖该方法,以提供您自己的对象相等概念.请注意,如果这样做,您通常也会至少覆盖__ne__(实现!=运算符)__hash__,并计算实例的哈希码.
我发现,即使在Python中,我的__eq__实现也非常有用,可以使我的实现符合Java语言中为equals方法实现所规定的规则,即:
最后一个可能应该更换null使用None,但规则是不容易在这里Python作为在Java中.
Ale*_*lli 18
==并且is在概念上总是不同的:前者委托给左手对象__eq__[1],后者总是检查身份,没有任何委托.让你感到困惑的是object.__eq__(当然,默认情况下由用户编码的类继承而不会覆盖它!)是以身份的形式实现的(毕竟,裸体除了它的身份之外object绝对无需检查),那还有什么可能呢?! - ).
[1]省略了__cmp__方法的遗留概念,这只是一个边缘的复杂因素,并且在段落的要点中没有任何重要的改变;-).
小智 7
该==确实比当整数涉及比较多的身份.它不只是检查两个整数是否是同一个对象; 它实际上确保了它们的值匹配.考虑:
>>> x=10000
>>> y=10000
>>> x==y,x is y
(True, False)
>>> del x
>>> del y
>>> x=10000
>>> y=x
>>> x==y,x is y
(True, True)
Run Code Online (Sandbox Code Playgroud)
"标准"Python实现在幕后为小内容做了一些事情,因此在使用小值进行测试时,您可能会得到不同的东西.将此与同等10000情况进行比较:
>>> del y
>>> del x
>>> x=1
>>> y=1
>>> x==y,x is y
(True, True)
Run Code Online (Sandbox Code Playgroud)