为啥字符串相等在此 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】:
您需要使用==
而不是is
。 is
检查对象身份不相等。
例如
假设您有foo
和bar
:
>>> 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)
int
s (-5, 256) 被缓存,因此此范围内的整数将使用 is 比较对象身份来评估为 true。
【讨论】:
非常感谢。我从来没有想过使用==
,因为我的印象是它们都是一样的。它解决了我的问题。
你是最棒的! xD 再过两分钟,我无法接受你的回答。 SOs 政策。【参考方案2】:
在我使用 Python 的整个历史中,我从未使用过 is
(这可能是因为我仍然无法理解 OOP)。只需使用常规相等运算符==
。
【讨论】:
有人给我的印象是is
更Pythonic。我猜他们错了。从现在开始,我会牢记在心。谢谢:)以上是关于为啥字符串相等在此 Python 代码中不能按预期工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我在 UIHostingController 中使用 SwiftUI-transition 时,它不能按预期工作?