我正在尝试与python中的字符串进行比较,并注意到当字符串中存在破折号/连字符时,它不会等同于相同的字符串。例如:
>>>teststring = 'newstring'
>>>teststring is 'newstring'
True
然后,如果我添加短划线
>>>teststring = 'new-string'
>>>teststring is 'new-string'
False
为什么会出现这种情况,以及将字符串与短划线进行比较的最佳方法是什么?
答案 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