python之间的区别==&引用;及;是";比较对象属性时

python之间的区别==&引用;及;是";比较对象属性时,python,python-2.7,boolean,boolean-logic,boolean-expression,Python,Python 2.7,Boolean,Boolean Logic,Boolean Expression,我不知道为什么在检查或比较对象的属性时会有差异。对象构造函数: 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.v

我不知道为什么在检查或比较对象的属性时会有差异。对象构造函数:

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
我在这里做错了什么?

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

obh.val_1 is "gnd"
比较内存中的两个对象(如果它们是相同的对象)。Python有时会对字符串进行实习,以便在字符串相同时重用它们。使用“is”来比较字符串并不总是有可预测的结果。从另一个意义上说,你有点

id(obh.val_1) == id("gnd") #id demonstrates uniqueness
使用“==”表示字符串相等,以达到您的目的

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

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

使用“==”表示字符串相等,以达到您的目的。

是测试对象标识,
=
测试相等。不同的测试之间有着不同的世界。如果两个引用指向两个不同的对象,身份测试将失败,但这两个对象仍然可以测试为相等。不太确定。如果我只检查或比较属性的值,我会得到正确的结果val_1=“gnd”val_2=10 val_1是“gnd”val_2==“gnd”>>>True>>True解释器可以将现有的字符串对象作为优化重用,但您不应该依赖该行为。@MartijnPieters我的答案是参考您的第一篇文章。这两个引用指向一个对象和一个对象的属性。只有两个不同的函数用于比较值。
是测试对象标识,
=
测试相等性。不同的测试之间有着不同的世界。如果两个引用指向两个不同的对象,身份测试将失败,但这两个对象仍然可以测试为相等。不太确定。如果我只检查或比较属性的值,我会得到正确的结果val_1=“gnd”val_2=10 val_1是“gnd”val_2==“gnd”>>>True>>True解释器可以将现有的字符串对象作为优化重用,但您不应该依赖该行为。@MartijnPieters我的答案是参考您的第一篇文章。这两个引用指向一个对象和一个对象的属性。只有两个不同的函数用于比较值。