为啥字符串相等在此 Python 代码中不能按预期工作? [复制]

Posted

技术标签:

【中文标题】为啥字符串相等在此 Python 代码中不能按预期工作? [复制]【英文标题】:Why does string equality not working in this Python code as expected? [duplicate]为什么字符串相等在此 Python 代码中不能按预期工作? [复制] 【发布时间】:2016-08-17 11:34:43 【问题描述】:

注意:在您对我的问题投反对票或关闭我的问题,或将其标记为重复之前,我向您保证,我已经在 SO 和 Google 上查看了几十个类似的问题,但经过更多一个多小时,我还没有解决这个问题。没有其他答案能解决我的问题。

问题 我有这个 Python 代码:

text = ''
text += '<' + '/' + '>'

print text, '</>'
print repr(text), repr('</>')

if text is '</>':
    print 'Equal'
else:
    print 'Not equal!'

我只是想比较两个字符串。出于某种原因,我需要将字符一个一个地连接到text。我希望 if 语句评估为True,但事实并非如此。我不知道为什么!

这是输出:

</> </> '</>' '</>' Not equal!

我是 Python 新手,并且正在使用 Python 2.7。有人可以帮忙吗?

【问题讨论】:

@gdlmx 那时我一定是找错地方了。谢谢。 我从没想过要寻找is==之间的区别,这就是为什么我从来没有找到这个帖子。 is 检查对象身份,即对象在内存中的方向而不是它们包含的值,为此使用==。只有内置常量才能保证与 is== 评估相同,这就是为什么您会更频繁地看到 a is None 这样的东西而不是 a == None,因为前者更惯用。因此,除非您正在检查 None 或者它们是否位于内存中的同一位置(也就是指向同一事物的点),否则请使用 == 【参考方案1】:

您需要使用== 而不是isis 检查对象身份不相等。

例如

假设您有foobar

>>> foo = 'green eggs and ham'
>>> bar = 'green eggs and ham'
>>> foo is bar
>>> False
>>> foo == bar
>>> True

在我的机器上:

>>> id(foo)
>>> 52008832 
>>> id(bar)
>>> 52010560

现在,看看这个:

>>> foobar = bar
>>> foobar is bar
>>> True

这是正确的,因为我们已将变量 foobar 别名为指向作为引用的 bar。显然,它们在此别名下引用了相同的位置。因此,is 返回 True。

更有趣的是,考虑两个ints。这仅适用于小整数 (-5, 256)。

>>> foo = 123
>>> bar = 123
>>> foo is bar
>>> True
>>> id(foo)
>>> 1993000432 # == id(bar)

ints (-5, 256) 被缓存,因此此范围内的整数将使用 is 比较对象身份来评估为 true。

【讨论】:

非常感谢。我从来没有想过使用==,因为我的印象是它们都是一样的。它解决了我的问题。 你是最棒的! xD 再过两分钟,我无法接受你的回答。 SOs 政策。【参考方案2】:

在我使用 Python 的整个历史中,我从未使用过 is(这可能是因为我仍然无法理解 OOP)。只需使用常规相等运算符==

【讨论】:

有人给我的印象是is 更Pythonic。我猜他们错了。从现在开始,我会牢记在心。谢谢:)

以上是关于为啥字符串相等在此 Python 代码中不能按预期工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个正则表达式模式不能按预期工作?

为啥这个回滚功能不能按预期工作

为啥我的 std::ref 不能按预期工作?

为啥使用 Vue 编辑数据不能按预期工作

为啥 nodejs 中的睡眠不能按预期工作

为啥当我在 UIHostingController 中使用 SwiftUI-transition 时,它不能按预期工作?