Pet*_*ter 12

不,这些都不一样.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.
Run Code Online (Sandbox Code Playgroud)

所以:==如果你的意思是对象应该表示相同的东西(最常见的用法),is如果你的意思是对象应该在相同的内存中(你知道你是否需要后者).

此外,您可以==通过__eq__操作员重载,但不能超载is.

  • Java没有`is`,所以很难说它与它完全相反. (3认同)
  • 是的,这是事后的编辑.这是依赖于解释器的,并且反映了小整数被缓存以获得速度的事实.因此,出于性能原因,等于"1"的东西将指向相同的地址.但是,你不能依赖于此. (2认同)

Chr*_*heD 5

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

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

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

还要记住,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
Run Code Online (Sandbox Code Playgroud)

  • 这是由于字符串/整数的长度,并且依赖于**解释器**:不依赖于此行为. (2认同)