python - 什么时候用==,什么时候用is?

标签 python memory equality

奇怪的是:

>>> a = 123
>>> b = 123
>>> a is b
True
>>> a = 123.
>>> b = 123.
>>> a is b
False

似乎 a is b 或多或少被定义为 id(a) == id(b)。这种方式很容易产生错误:

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

一些 fname 意外地出现在 else block 中。解决方法很简单,我们应该使用 ext == '.mp3' 代替,但表面上看来 if ext is '.mp3' 似乎是一个不错的 Pythonic 方式写这个,它比“正确”的方式更具可读性。

既然字符串是不可变的,那么它为什么会出错的技术细节是什么?什么时候身份检查更好,什么时候平等检查更好?

最佳答案

它们本质上是不同的。

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

所以与说 Java 相比:

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

关于python - 什么时候用==,什么时候用is?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6570371/

相关文章:

python - 导入处理/模块从 python2 更改为 python3?

java - vector 列表中的内存泄漏 Java OutOfMemoryError

java内存不足然后退出

c++ - 类多态性和相等运算符

java - 如何在 Java 中比较字符串?

ruby - 使用#include 将对象与自身进行比较时不使用自定义 == 运算符?

python - 如何操作 csv 的内容(分组并存储到列)

python - elasticSearch批量的geo_point类型

python - 在 MacOs Python shell 中粘贴多行返回 SyntaxError

python - PyPDF2:在内存中连接pdf