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 bTrue iff ab 是同一个对象(它们都存储在同一个内存地址中)。

== 检查平等,这通常由魔术方法__eq__ 定义 - 即,如果a.__eq__(b)True,则a == bTrue

具体而言,Python 将两个硬编码的字符串优化为同一个对象(因为字符串是不可变的,所以没有危险)。由于input()会在运行时创建一个字符串,所以它不能做那个优化,所以创建了一个新的字符串对象。

【讨论】:

--input() 将在运行时创建一个字符串 x = 5 y = int(input()) # 【参考方案2】:

is 不检查对象是否相等,而是检查对象是否实际上是同一个对象。由于input() 总是创建一个新字符串,它永远不会is 另一个字符串。

Python 为所有出现的相同字符串文字创建一个对象,这就是为什么 xy 指向同一个对象。

【讨论】:

我喜欢“它永远不会is

以上是关于Python:'is'和'=='有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的“a is b”和“id(a) == id(b)”有啥区别?

“4 和 5”是 5,“4 或 5”是 4。有啥原因吗? [复制]

python中的b''和''有啥区别? [复制]

python中的range和xrange有啥区别? [复制]

python中的[None]和[]有啥区别? [复制]

NumPy 数组和 python 列表有啥区别? [复制]