Python字符串比较不匹配正斜杠

时间:2013-04-11 09:45:52

标签: python string comparison

一个简单的问题通常有一个简单的答案,但我很难找到它。有人可以解释为什么以下不匹配?

string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'

5 个答案:

答案 0 :(得分:3)

使用::

string = 'HTTP/NONE'
if string == 'HTTP/NONE':
    print 'Match!'
else:
    print 'No Match!'

适合我。显然,字符串如==

答案 1 :(得分:2)

请改用==。另外要小心不要将变量命名为python模块。

>>> mystr = 'HTTP/NONE'
>>> mystr is 'HTTP/NONE'
False
>>> mystr == 'HTTP/NONE'
True

is运算符测试标识 - 仅返回True具有相同id的对象。 ==仅检查两个对象是否具有相同的值,这是您想要的。如果我们检查idmystr的{​​{1}},我们可以看到它们不同。

'HTTP/NONE'

答案 2 :(得分:2)

is测试身份。来自Python Documentation

  

运算符isis not测试对象标识:当{且仅当x和y是同一个对象时,x is y为真。 x is not y产生反向真值。

在处理比较值时,您最好使用==。示例ipython会话:

In [1]: s = 'A/B'

In [2]: s == 'A/B'
Out[2]: True

In [3]: s is 'A/B'
Out[3]: False

In [4]: b = 'A/B'

In [5]: s is b
Out[5]: False

In [6]: b == s
Out[6]: True

鉴于身份运算符检查比较的对象的id,其结果有怪癖,因为Python缓存intfloat,小字符串。通过调用id()函数:

可以看到这一点
In [28]: s1, s2 = 'Joe', 'Joe'

In [29]: id(s1), id(s2)
Out[29]: (21399760, 21399760)

In [30]: s1 is s2
Out[30]: True

正如您所看到的,在这种情况下,即使它们是由不同的分配操作创建的,s1s2都是相同的对象

Here与int对象类似,与Python文档中的this解释相关:

  

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。

我没有找到字符串类型的解释,但我认为同样的情况正在发生,因此is不应该用于值比较。它有时可能会返回False,有时会返回True

In [39]: s = 'Joe'

In [40]: id('Joe')
Out[40]: 21403136

In [41]: id(s)
Out[41]: 21403136

In [42]: s is 'Joe'
Out[42]: True
祝你好运!

答案 3 :(得分:1)

您正在测试身份,而不是平等。请改用==

你的身份与平等相混淆。两张1美元钞票具有相同的价值,因此在购买甜甜圈时它们是相同的。但他们每个人都有一个独立的身份。

为了帮助提高性能,当您告诉Python存储相同的文字值时,Python有时会使用相同的对象。这称为实习,当发生这种情况时,您会获得对{em>发生的intstr值的引用对象也是。

is测试身份;它基本上实现为id(a) == id(b),如果它们的值的标识相等,则两个引用是相同的。它们指的是相同的对象,而不仅仅是相同的

答案 4 :(得分:0)

string = 'HTTP/NONE'
if string == 'HTTP/NONE': print 'match'

它会起作用。