引用python中的字符串比较

时间:2014-02-26 11:50:17

标签: python

我想检查两个变量是否引用不同的对象。我知道在python中,Strings也是对象(我现在是Java程序员学习python)。我读到is检查引用,==检查值,但是当我运行以下代码时,它似乎检查了值!

name1 = "ABC D"
name2 = "ABC D"

if name1 is name2:
    print "Equal!!!"
else:
    print "NOT equal!!!"

它给出了相同的意义!

2 个答案:

答案 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)