一个简单的问题通常有一个简单的答案,但我很难找到它。有人可以解释为什么以下不匹配吗?
string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'
一个简单的问题通常有一个简单的答案,但我很难找到它。有人可以解释为什么以下不匹配吗?
string = 'HTTP/NONE'
if string is 'HTTP/NONE': print 'match'
利用::
string = 'HTTP/NONE'
if string == 'HTTP/NONE':
print 'Match!'
else:
print 'No Match!'
为我工作。显然,像 == 这样的字符串
改为使用==
。还要小心不要将变量命名为与 python 模块相同的名称。
>>> mystr = 'HTTP/NONE'
>>> mystr is 'HTTP/NONE'
False
>>> mystr == 'HTTP/NONE'
True
is
运算符测试身份-并且仅返回True
具有相同id
. ==
仅检查两个对象是否具有相同的值,这就是您想要的。如果我们检查 和 的id
s mystr
,'HTTP/NONE'
我们可以看到它们是不同的。
>>> id(mystr)
64342000
>>> id('HTTP/NONE')
64341360
is
身份测试。来自Python 文档:
对象身份的运算符
is
和测试:当且仅当 x 和 y 是同一个对象时为真。产生逆真值。is not
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
都是同一个对象。
这是一个与 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
祝你好运!
您正在测试身份,而不是平等。改为使用==
。
您将身份与平等混淆了。两张 1 美元的钞票具有相同的价值,因此在购买甜甜圈时它们是相等的。但他们每个人都有不同的身份。
为了提高性能,有时当您告诉 Python 存储相同的文字值时,Python 会使用相同的对象。这称为interning,当发生这种情况时,您会获得对恰好是同一个对象的一个int
或一个str
值的引用。
is
身份测试;它基本上实现为id(a) == id(b)
,如果两个引用的值相同,则它们是相同的。指的是同一个对象,而不仅仅是同一个值。
string = 'HTTP/NONE'
if string == 'HTTP/NONE': print 'match'
它会起作用的。