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

sam*_*fer 5 python string special-characters python-2.7

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

>>>teststring = 'newstring'
>>>teststring is 'newstring'
True
Run Code Online (Sandbox Code Playgroud)

然后,如果我添加一个破折号

>>>teststring = 'new-string'
>>>teststring is 'new-string'
False
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?将字符串与破折号进行比较的最佳方法是什么?

Ada*_*ith 4

无论如何,你不应该使用is比较相等性。is身份测试。使用==

坦白说我不知道​​为什么'newstring' is 'newstring'。我确信它会根据你的 Python 实现而有所不同,因为它看起来像是一个节省内存的缓存来重用短字符串。

然而:

teststring = 'newstring'
teststring == 'newstring' # True

nextstring = 'new-string'
nextstring == 'new-string' # True
Run Code Online (Sandbox Code Playgroud)

基本上所有的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.
Run Code Online (Sandbox Code Playgroud)

  • 从我的回答来看:*[T]Python 编译器还将实习任何存储为常量的 Python 字符串,只要它是有效的标识符。Python 代码对象工厂函数 PyCode_New 将驻留任何仅包含字母、数字或下划线*的字符串对象。 (3认同)
  • 请参阅[关于更改 Python 不可变字符串的 id](http://stackoverflow.com/a/24245514) 了解为什么“is”*有时*有效。 (2认同)