2014-05-12 52 views
0

我不确定为什么在检查或比较对象属性时存在差异。对象construtor:创建当比较对象属性时,“==”和“is”之间的python区别

class FooBarObject(): 
    def __init__(self, val_1, val_2): 
     self.val_1 = val_1 
     self.val_2 = val_2 

对象:

obj = FooBarObject(val_1 = "gnd", val_2 = 10). 

我已经注意到,我得到不同的结果时:

obj.val_1 is "gnd" 
obj.val_1 == "gnd" 
>>> False 
>>> True 

我在做什么错在这里?

+3

'是'测试*对象身份*,'=='测试*相等*。测试之间存在着不同的世界。如果两个引用指向两个不同的对象,则身份测试将失败,但这两个对象仍然可以测试为* equal *。 –

+0

不太确定。如果我只检查或比较属性的值,我得到正确的结果 val_1 = “GND” val_2 = 10 val_1是 “GND” val_2 == “GND” >>>真 >>>真 – avstenit

+0

解释器可以*重用*现有的字符串对象作为优化,但不应该*依赖*行为。 –

回答

3
obh.val_1 is "gnd" 

比较内存中的两个对象,如果它们是相同的对象。 Python有时会实施字符串以便在它们相同时重用它们。使用“是”来比较字符串并不总是有可预见的结果。从另一种意义上说,你叫

id(obh.val_1) == id("gnd") #id demonstrates uniqueness 

使用“==”表示字符串相等来实现你的意图。

2

当您使用"=="时,您正在比较内存中变量的内容,因此任何匹配都会导致“True”,但使用"is"时,RAM中的地址必须相同,因此会导致一个错误,因为它们存储在内存中的不同位置