我想检查两个变量是否引用不同的对象。我知道在python中,Strings也是对象(我现在是Java程序员学习python)。我读到is
检查引用,==
检查值,但是当我运行以下代码时,它似乎检查了值!
name1 = "ABC D"
name2 = "ABC D"
if name1 is name2:
print "Equal!!!"
else:
print "NOT equal!!!"
它给出了相同的意义!
答案 0 :(得分:4)
python解释器将实习小字符串文字(其中“小”是依赖于实现的)。这就是name1 is name2
给出True
的原因:两个名称引用相同的字符串对象。
CPython,也可能是其他实现,并没有实现运行时表达式的结果,所以如果你真的需要你的字符串成为不同的对象,你可以动态地构建它们。例如:
In [1]: prefix = 'ABC '
In [2]: a = prefix + 'D'
In [3]: b = prefix + 'D'
In [4]: a is b
Out[4]: False
另一方面,如果你只是试验看会发生什么,但你关心的字符串已经来自运行时表达式,你不应该做任何特别的事情。
我想说,无论如何,字符串实习是一个实现细节。根据您的使用情况,如果您确实需要确保对象始终具有不同的标识,则应该使用自定义类。例如:
class Marker(str):
__slots__ = ()
这可能会按预期工作:
In [6]: Marker('ABC D')
Out[6]: 'ABC D'
In [7]: Marker('ABC D') is Marker('ABC D')
Out[7]: False
In [8]: Marker('ABC D') == Marker('ABC D')
Out[8]: True
除非您计划将对象用作字典中的键,并且您希望不同的对象是不同的键。但是,在这种情况下,普通字符串也不起作用。
答案 1 :(得分:2)
正如马蒂亚斯的评论一样,name1 = "ABC D"
只是指定对象的引用" ABC D"到name1。
如果有疑问,你可以通过id()检查底层对象,检查python是否与你想象的一样:)
name1 = "ABC D"
name2 = "ABC D"
name3 = "Different string"
print id(name1)
print id(name2)
print id(name3)