用连字符/破折号比较两个python字符串

时间:2014-06-17 17:57:04

标签: python string python-2.7 special-characters

我正在尝试与python中的字符串进行比较,并注意到当字符串中存在破折号/连字符时,它不会等同于相同的字符串。例如:

>>>teststring = 'newstring'
>>>teststring is 'newstring'
True

然后,如果我添加短划线

>>>teststring = 'new-string'
>>>teststring is 'new-string'
False

为什么会出现这种情况,以及将字符串与短划线进行比较的最佳方法是什么?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

您不应该使用is进行字符串比较。检查两个对象是否相同。您应该在此处使用等于运算符==。这比较了对象的值,而不是对象的id。

在这种情况下,看起来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