python中的引用字符串比较

python中的引用字符串比较,python,Python,我想检查两个变量是否引用不同的对象。我知道在python中字符串也是对象(我现在是学习python的Java程序员)。我读到is检查引用,而=检查值,但当我运行以下代码时,它似乎检查了值 name1 = "ABC D" name2 = "ABC D" if name1 is name2: print "Equal!!!" else: print "NOT equal!!!" 它给了我们平等的回报 与Matthias的评论一样,name1=“ABC D”只是将对象“ABC D”

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

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

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

它给了我们平等的回报

与Matthias的评论一样,
name1=“ABC D”
只是将对象“ABC D”的引用分配给name1

如果有疑问,您实际上可以通过id()检查底层对象,以检查python的工作方式是否与您认为的相同:)


在Matthias的评论中,
name1=“ABC D”
只是将对象“ABC D”的引用分配给name1

如果有疑问,您实际上可以通过id()检查底层对象,以检查python的工作方式是否与您认为的相同:)


python解释器将插入小字符串文本(其中“small”取决于实现)。这就是为什么
name1是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 [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

除非您计划将对象用作字典中的键,并且希望不同的对象是不同的键。但是,在这种情况下,普通字符串也不起作用。

python解释器将插入小字符串文本(其中“小”取决于实现)。这就是为什么
name1是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 [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

除非您计划将对象用作字典中的键,并且希望不同的对象是不同的键。但是,在这种情况下,普通字符串也不起作用。

可能以不同的方式处理字符串文本。。尝试使用两个对象…字符串在Python中是不可变的,因此可以重用。另请参阅Python中的字符串池:字符串文本可能以不同的方式处理。。尝试使用两个对象…字符串在Python中是不可变的,因此可以重用。另请参阅Python中的字符串池:但是如何检查引用两个字符串的两个变量是否不同?假设我希望name1和name2真的不同,但具有相同的字符串值@AlexTwain为什么要这样做呢?但是如何检查引用两个字符串的两个变量是否不同呢?假设我希望name1和name2真的不同,但具有相同的字符串值@亚历克斯吐温,你为什么要这么做?