【问题标题】:What is the difference between "is" and "==" in python? [duplicate]python中的“is”和“==”有什么区别? [复制]
【发布时间】:2010-12-10 16:46:43
【问题描述】:

可能重复:
Python ‘==’ vs ‘is’ comparing strings, ‘is’ fails sometimes, why?

a == b

a is b

?

如果不是,有什么区别?

编辑: 为什么

a = 1
a is 1

返回真,但是

a = 100.5
a is 100.5

返回假?

【问题讨论】:

标签: python operators


【解决方案1】:

不,这些不一样。 is 是对对象身份的检查——即检查ab 是否完全相同。示例:

a = 100.5
a is 100.5  # => False
a == 100.5  # => True

a = [1,2,3]
b = [1,2,3]
a == b  # => True
a is b  # => False
a = b
a == b  # => True
a is b  # => True, because if we change a, b changes too.

所以:如果您的意思是对象应该代表相同的东西(最常见的用法),请使用==,如果您的意思是对象应该在相同的内存中(您会知道是否需要后者) )。

此外,您可以通过__eq__ 运算符重载==,但不能重载is

【讨论】:

  • Java 没有is,所以很难说这与它完全相反。
  • 在java中,==测试内存地址
  • 很好的答案,但没有回答关于a is 1 返回true 的部分。
  • 是的,这是事后的编辑。这是依赖于解释器的,并且反映了小整数被缓存以提高速度的事实。因此,出于性能原因,等于1 的东西将指向相同的地址。不过,你不能依赖这个。
  • @hasen j 我不确定底层引擎,但如果a = [1,2,3]b = [1,2,3],那么无论内存地址如何,a == b 都不会评估为真?
【解决方案2】:

正如上面已经非常清楚地解释的那样。

:用于身份测试(相同的“对象”)

== :用于相等性测试(~~ 相同值)

另外请记住,Python 使用字符串实习(作为一种优化),因此您可以获得以下奇怪的副作用:

>>> a = "test"
>>> b = "test"
>>> a is b
True
>>> "test_string" is "test" + "_" + "string"
True

>>> a = 5; b = 6; c = 5; d = a
>>> d is a
True  # --> expected
>>> b is a
False # --> expected
>>> c is a
True  # --> unexpected

【讨论】:

  • 对于数字,它只适用于占字节的整数(例如<= 256
  • 对于字符串,它不会神奇地“检测”相似的字符串。考虑:>>> a = "test" >>> b = "test" >>> a is b True >>> a = "test_string" >>> c = b + "_string" >>> a == c True >>> a is c False
  • 这是由于字符串/整数的长度,并且是依赖于解释器的:不要依赖这种行为。
猜你喜欢
  • 2014-02-24
  • 2015-05-18
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多