一个简单的问题通常有一个简单的答案,但我很难找到它。有人可以解释为什么以下不匹配?
string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'
答案 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
的对象。 ==
仅检查两个对象是否具有相同的值,这是您想要的。如果我们检查id
和mystr
的{{1}},我们可以看到它们不同。
'HTTP/NONE'
答案 2 :(得分:2)
is
测试身份。来自Python Documentation:
运算符
is
和is 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缓存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
正如您所看到的,在这种情况下,即使它们是由不同的分配操作创建的,s1
和s2
都是相同的对象。
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>发生的int
或str
值的引用对象也是。
is
测试身份;它基本上实现为id(a) == id(b)
,如果它们的值的标识相等,则两个引用是相同的。它们指的是相同的对象,而不仅仅是相同的值。
答案 4 :(得分:0)
string = 'HTTP/NONE'
if string == 'HTTP/NONE': print 'match'
它会起作用。