【问题标题】:Compare two Python strings with hyphen/dash用连字符/破折号比较两个 Python 字符串
【发布时间】:2014-06-17 17:57:04
【问题描述】:

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

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

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

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

为什么会这样?比较字符串和破折号的最佳方法是什么?

【问题讨论】:

  • 测试平等,而不是身份。使用==

标签: python string python-2.7 special-characters


【解决方案1】:

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

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

但是:

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

nextstring = 'new-string'
nextstring == 'new-string' # True

基本上所有is 所做的只是测试ids 以确保它们相同。

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.

【讨论】:

  • 查看About the changing id of a Python immutable string 了解is 为何有时起作用。
  • 根据我的回答:[T]Python 编译器还将实习生任何存储为常量的 Python 字符串,只要它是一个有效的标识符。 Python 代码对象工厂函数 PyCode_New 将实习生任何只包含字母、数字或下划线的字符串对象
  • 这里更深入地了解了默认实习的内容:guilload.com/python-string-interning
【解决方案2】:

您不应该使用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

【讨论】:

  • 请参阅About the changing id of a Python immutable string,了解 Python 实习生字符串(以及身份测试何时起作用)。
  • 有道理。所以这类似于 python 对 0-255 个整数对象所做的事情,这些对象始终存在于内存中。 Python 从不为这些整数创建新对象,只是在需要时添加引用计数。
  • 确实如此。然而,这是一个实现细节,而不是你的代码应该依赖的东西。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
相关资源
最近更新 更多