Python:'is'和'=='有啥区别? [复制]
Posted
技术标签:
【中文标题】Python:\'is\'和\'==\'有啥区别? [复制]【英文标题】:Python: what difference between 'is' and '=='? [duplicate]Python:'is'和'=='有什么区别? [复制] 【发布时间】:2014-02-24 01:14:22 【问题描述】:我正在尝试下一个代码:
x = 'asd'
y = 'asd'
z = input() #write here string 'asd'. For Python 2.x use raw_input()
x == y # True.
x is y # True.
x == z # True.
x is z # False.
为什么我们在最后一个表达式中有 false?
【问题讨论】:
对于小字符串部分:is
operator behaves differently when comparing strings with spaces
我不认为这是重复的。标题具有误导性,但我认为它专门说明了为什么输入的字符串不一样。与另一个问题一样,它也不包含空格。
问题可能略有不同,但答案是一样的——巧合的是,is
有时作为 cpython 中的实现细节起作用。涉及输入的事实并不是特别特别。要点应该是永远不要使用is
。
这正是我来的目的
【参考方案1】:
is
检查身份。 a is b
是 True
iff a
和 b
是同一个对象(它们都存储在同一个内存地址中)。
==
检查平等,这通常由魔术方法__eq__
定义 - 即,如果a.__eq__(b)
是True
,则a == b
是True
。
具体而言,Python 将两个硬编码的字符串优化为同一个对象(因为字符串是不可变的,所以没有危险)。由于input()
会在运行时创建一个字符串,所以它不能做那个优化,所以创建了一个新的字符串对象。
【讨论】:
--input() 将在运行时创建一个字符串 x = 5 y = int(input()) # 【参考方案2】:is
不检查对象是否相等,而是检查对象是否实际上是同一个对象。由于input()
总是创建一个新字符串,它永远不会is
另一个字符串。
Python 为所有出现的相同字符串文字创建一个对象,这就是为什么 x
和 y
指向同一个对象。
【讨论】:
我喜欢“它永远不会is
”以上是关于Python:'is'和'=='有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Python中的“a is b”和“id(a) == id(b)”有啥区别?
“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]