【问题标题】:What is the difference between keyword: is and == in python关键字:is和==在python中有什么区别
【发布时间】:2012-03-16 07:07:45
【问题描述】:

根据 python 风格指南,python 关键字 is 应该用来代替 == 运算符。

但是,他们并不总是做与此处所示完全相同的事情。为什么?实际的区别是什么,正确的用法是什么?

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ == '__main__':
    unittest.main()

哪个有效...但以下无效...

import unittest

class testIS(unittest.TestCase):
    def test_is(self):
        self.assertEqual(1,1)

if __name__ is '__main__':
    unittest.main()

【问题讨论】:

标签: python syntax keyword


【解决方案1】:

== 测试是否相等。两个不相同的对象可以相等。

is 测试身份,即两者是否都指向同一个对象。

【讨论】:

  • 最好是== 测试价值,而is 测试身份。
  • @nightcracker: 不,使用含糊不清的术语 equality 实际上是准确的,因为平等的定义是由对象的类型定义的。除非您在用户定义的类中覆盖 __eq__,否则 == 会检查身份,而不是值。
  • @André Caron:默认实现是一个猜测,其中身份恰好是 Python 中一个很好的猜测。但它并没有改变它的语义,它是值相等的测试。
  • @nightcracker 'value' 是一个微妙的术语。例如,我可以定义一种类型的对象以 0.5 的概率相等,而不管它们的值如何。或者我可以有一个临时对象 'ignorecase(str)',它只能与字符串比较是否相等。讨论这些对象有什么价值对我来说似乎毫无意义,但测试相等性是有意义的。
  • @nightcracker:该类可以使__eq__ 表示任何对抽象有意义的东西,包括身份相等。这不一定是价值平等。
【解决方案2】:
如果两个变量指向同一个对象,

is 将返回 True,如果变量引用的对象相等,则返回 ==

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

【讨论】:

  • 标记为提供快速示例的最佳答案 :)
【解决方案3】:
if money_in_wallet is money_that_was_in_wallet(two_weeks_ago):
    print("I still live with my parents and have no income or expenses")
elif money_in_wallet == money_that_was_in_wallet(two_weeks_ago):
    print("Good, my budget is exactly balanced")

【讨论】:

    【解决方案4】:

    看看...

    http://docs.python.org/reference/expressions.html#not-in

    ...哪个州...

    运算符 isis not 测试对象身份:当且仅当 x 和 y 是同一个对象时,x 为 y 为真

    【讨论】:

      【解决方案5】:

      Python 关键字“is”检查对象身份,而 == 运算符检查值是否相等。例如:

      >>> if Car1 is Car2:
      >>>     [do something...]
      

      此代码测试 Car1 和 Car2 是否引用同一辆车,而

      >>> if Car1 == Car2:
      >>>     [do something...]
      

      检查 Car1 和 Car2 是否具有相同的质量,即它们是否具有相同的型号、颜色等。

      为此,__name__"__main__" 返回 False,因为字符串"__main__" 和存储在__name__ 中的值实际上是两个不同的字符串对象。所以要检查__name__字符串的值是否等于__main__,使用==操作符。

      【讨论】:

        【解决方案6】:

        is 测试两个输入是否实际上是同一个对象。那位于内存中的相同地址。

        == 在其中一个输入对象上调用 __eq__ 方法。然后对象可以定义自己的 __eq__ 方法并决定什么是相等的,什么不是。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          • 1970-01-01
          • 1970-01-01
          • 2015-05-18
          • 2010-12-10
          • 2019-04-05
          • 2014-05-26
          相关资源
          最近更新 更多