比较两个带连字符的Python字符串
我在用Python比较两个字符串的时候发现,如果字符串里有一个短横线(-),那么即使其他部分完全一样,它们也不会被认为是相等的。例如:
>>>teststring = 'newstring'
>>>teststring is 'newstring'
True
然后,如果我加上一个短横线
>>>teststring = 'new-string'
>>>teststring is 'new-string'
False
这是为什么呢?那比较带短横线的字符串,最好的方法是什么呢?
2 个回答
0
你不应该用 is
来比较字符串。这个 is
是用来检查两个对象是不是同一个东西。你应该用相等运算符 ==
来比较,这样可以比较对象的值,而不是它们的身份。
在这种情况下,Python 对字符串对象做了一些优化,所以才会有这样的表现。
>>> teststring = 'newstring'
>>> id(teststring)
4329009776
>>> id('newstring')
4329009776
>>> teststring = 'new-string'
>>> id(teststring)
4329009840
>>> id('new-string')
4329009776
>>> teststring == 'new-string'
True
>>> teststring is 'new-string'
False
4
其实你根本不应该用 is
来比较两个东西是否相等。is
是用来检查两个对象是否是同一个东西。你应该用 ==
来比较。
老实说,我也不知道为什么 'newstring' is 'newstring'
会成立。我相信这和你使用的 Python 版本有关,因为它看起来像是为了节省内存而重用短字符串的缓存。
不过:
teststring = 'newstring'
teststring == 'newstring' # True
nextstring = 'new-string'
nextstring == 'new-string' # True
简单来说,is
只是用来检查两个对象的 id
是否相同。
id('new-string') # 48441808
id('new-string') # 48435352
# These change
id('newstring') # 48441728
id('newstring') # 48441728
# These don't, and I don't know why.