1

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

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

5 回答 5

3

利用::

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

为我工作。显然,像 == 这样的字符串

于 2013-04-11T09:50:03.857 回答
2

改为使用==。还要小心不要将变量命名为与 python 模块相同的名称。

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

is运算符测试身份-并且仅返回True具有相同id. ==仅检查两个对象是否具有相同的值,这就是您想要的。如果我们检查 和 的ids mystr'HTTP/NONE'我们可以看到它们是不同的。

>>> id(mystr)
64342000
>>> id('HTTP/NONE')
64341360
于 2013-04-11T09:47:29.853 回答
2

is身份测试。来自Python 文档

对象身份的运算符is和测试:当且仅当 x 和 y 是同一个对象时为真。产生逆真值。is notx is yx 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 缓存int, float, 小字符串。这是通过调用函数可见的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都是同一个对象

是一个与 int 对象类似的情况,与Python 文档中的解释相关:

当前的实现为 -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

祝你好运!

于 2013-04-11T09:48:19.583 回答
1

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

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

为了提高性能,有时当您告诉 Python 存储相同的文字值时,Python 会使用相同的对象。这称为interning,当发生这种情况时,您会获得对恰好是同一个对象的一个int​​或一个str值的引用。

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

于 2013-04-11T09:47:16.890 回答
0
string = 'HTTP/NONE'
if string == 'HTTP/NONE': print 'match'

它会起作用的。

于 2013-04-11T11:09:13.323 回答