当前位置: 首页 > 知识库问答 >
问题:

Python无比较:我应该使用“is”还是==?

秦宁
2023-03-14

当我比较时,编辑器会警告我my_var==无,但是当我使用时,没有警告my_var是无

我在pythonshell中做了一个测试,确定两者都是有效语法,但我的编辑器似乎在说my_var is None是首选。

情况是否如此,如果是,原因何在?

共有3个答案

司马耘豪
2023-03-14

PEP 8定义在比较单例时最好使用is运算符。

鄢英毅
2023-03-14

is在比较任意对象和单例对象时通常是首选的,因为它更快,更可预测。is总是通过对象标识进行比较,而=将做什么取决于确切的类型操作数,甚至它们的顺序。

这一建议得到了PEP 8的支持,PEP 8明确规定“应始终使用isis not进行与无这样的单例的比较,永远不要使用相等运算符。”

叶光华
2023-03-14

当您想检查对象的标识时,请使用is(例如,检查var是否为)。使用==当您想要检查相等性(例如:是var等于3?)。

您可以使用自定义类,其中my_var==None将返回True

例如:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

is检查对象标识。只有一个对象None,因此当您执行my_var is None,您将检查它们是否实际上是相同的对象(而不仅仅是等效对象)

换句话说,==是等价性检查(从对象到对象定义),而是对象标识检查:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

 类似资料:
  • 问题内容: 我正在使用Python2.x。 比较时我的编辑会警告我,但使用时不会警告。 我在Python Shell中进行了测试,并确定两者都是有效的语法,但我的编辑器似乎在说这是首选。 是这样吗?如果是,为什么? 问题答案: 摘要: 使用时要核对对象的身份(如检查,看看是否是)。使用时要检查的平等(例如是等于?)。 说明: 你可以在其中返回的自定义类True 例如: is检查对象身份。只有1个对

  • 本文向大家介绍Python通过`is`与`==`比较,包括了Python通过`is`与`==`比较的使用技巧和注意事项,需要的朋友参考一下 示例 常见的陷阱是混淆相等比较运算符is和==。 a == b比较的值a和b。 a is b将比较认同的a和b。 为了显示: 基本上,is可以视为的简写。id(a) == id(b) 除此之外,还有一些运行时环境的怪癖使事情变得更加复杂。True与相比,短字符

  • 问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果

  • 问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前

  • 问题内容: 我正在一个将Angular和Underscore都作为依赖项的项目。 当我需要创建对象的副本时,根据当时的心情,我可以使用或 在我看来,这些方法中的一种可能比另一种更快速/可靠/健壮。 假设已经包含两个库,那么这两个函数中的任何一个是否存在使另一个函数更好或更坏使用的已知问题? 问题答案: 关于您的问题: angular.copy和_.clone是不同的。这不是哪个更好的问题,而是关于

  • 问题内容: 我想从文本文件中读取每一行并将它们存储在ArrayList中(每一行是ArrayList中的一项)。 到目前为止,我知道BufferedInputStream写入缓冲区,并且仅在缓冲区为空时才进行另一次读取,这可以最大程度地减少或至少减少操作系统的操作量。 我正确吗-我说得通吗? 如果以上情况是在任何情况下,任何人都想使用DataInputStream。最后,我应该使用这两个中的哪一个