何时使用==以及何时使用?

wim*_*wim 23 python memory equality

奇怪的是:

>>> a = 123
>>> b = 123
>>> a is b
True
>>> a = 123.
>>> b = 123.
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

似乎a is b或多或少被定义为id(a) == id(b).以这种方式制作错误很容易:

basename, ext = os.path.splitext(fname)
if ext is '.mp3':
    # do something
else:
    # do something else
Run Code Online (Sandbox Code Playgroud)

一些fnames意外地在else块中结束了.修复很简单,我们应该使用ext == '.mp3',但if ext is '.mp3'表面上看起来似乎是一种很好的pythonic方式来编写它,它比"正确"的方式更具可读性.

由于字符串是不可变的,为什么它是错误的技术细节是什么?什么时候身份检查更好,什么时候检查更好?

Pet*_*nov 23

它们根本不同.

  1. ==通过调用__eq__方法进行比较
  2. is 当且仅当两个引用属于同一对象时才返回true

所以与Java说比较:

  1. is==对象相同
  2. ==equals对象相同


Vat*_*ine 12

据我所知,is检查对象标识的等价性.由于没有强制性的"字符串实习",因此恰好在序列中碰巧具有相同字符的两个字符串通常不是相同的字符串对象.

从字符串中提取子字符串时(或者,实际上是序列中的任何子序列),最终会得到两个不同的对象,包含相同的值.

因此,is只有在比较对象标识时才使用.==比较值时使用.

  • 实际上,有_is_字符串实习.对于动态创建的字符串,这不会发生. (4认同)

Mik*_*maa 7

确定是否使用的简单规则是Python中的==

这是一个简单的规则(除非你想在Python解释器或构建框架中使用Python对象做有趣的事情):

使用仅适用于无比较.

if foo is None
Run Code Online (Sandbox Code Playgroud)

否则使用==.

if x == 3
Run Code Online (Sandbox Code Playgroud)

那么你是安全的.在上述评论中已经解释了这个的基本原理.如果你不是100%确定为什么要这样做,请不要使用.

  • 使用 `isinstance` 等式 `isinstance("foo", str)` 检查类型,或者,如果您想排除子类,`type("foo") == str` 就足够了。 (2认同)