【问题标题】:Python: Difference between != and "is not"Python:!= 和“不是”之间的区别
【发布时间】:2011-04-25 19:20:08
【问题描述】:

我不清楚!=is not 语法之间的区别。他们似乎在做同样的事情:

>>> s = 'a'
>>> s != 'a'
False
>>> s is not 'a'
False

但是,当我在列表推导中使用 is not 时,它会产生与使用 != 不同的结果。

>>> s = "hello"
>>> [c for c in s if c is not 'o']
['h', 'e', 'l', 'l', 'o']
>>> [c for c in s if c != 'o']
['h', 'e', 'l', 'l']

为什么o 被包含在第一个列表中,而不是第二个列表中?

【问题讨论】:

  • 当您查看这两个运算符的 Python 语言参考时,您看到了什么?这似乎很清楚:docs.python.org/reference/expressions.html#notin。哪一部分让你感到困惑?
  • @FChannel72 我认为在表达式 c is not 'o' 中存在 is 会引发对 id(c) is not 'o' 的评估。由于数字(地址 id(c))不是字符串,因此测试结果为 True,因此 c 保留在构建列表中。
  • @FChannel72 问题是我验证了你的结果,我为这两个表达式获得了['h', 'e', 'l', 'l']!我想知道为什么,如果is 的存在引发比较 id(c),它也不会引发将其与 id('o') 进行比较。事实上,似乎 c is not 'o' 在我的 Python 2.7 中被评估为 id(c)!=id('o') ...
  • @FChannel72 Wooble 在底部给出的链接让我觉得结果取决于 Python 的版本。你有哪一个?我测试了a = 257457895426b = 257457895426 ; print a is b 我得到了 True,在 Python 2.7 中
  • 这真的很奇怪,我无法重新创建:Python 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0 .68)] on darwin 键入“help”、“copyright”、“credits”或“license”以获取更多信息。 >>> s = "hello" >>> [c for c in s if c is not 'o'] ['h', 'e', 'l', 'l'] >>> [c for c in s if c != 'o'] ['h', 'e', 'l', 'l']

标签: python syntax list-comprehension


【解决方案1】:

is 测试对象身份,但== 测试对象值相等:

In [1]: a = 3424
In [2]: b = 3424

In [3]: a is b
Out[3]: False

In [4]: a == b
Out[4]: True

【讨论】:

  • 操作示例中的字符串不起作用的原因是python将字符串分配给变量的方法的工件。由于字符串是不可变的,因此在全局命名空间中,包含相同字符串的两个变量将引用同一个对象。
  • 您使用哪种 Python?使用 Python 2.7,我为指令 a is b 获得 True !
  • 这是使用 Python 2.6.4。实现可以选择缓存某些对象。在我的系统上,“a”通过了is 测试,但“苹果酱”没有。
  • 对于好奇,这是因为 'a' 看起来像一个标识符(因此解释器缓存它),但 'apple sauce' 不是(由于空间),所以如果你想缓存它您必须通过intern() 明确地这样做。
【解决方案2】:

is not 比较引用。 == 比较值

【讨论】:

  • 为什么a==123设置a=123后返回true?
  • @ajwood:因为它们具有相同的值。 == 比较值。
  • 一个更好的问题是为什么“a is 123”在大多数实现中返回 True。 (见stackoverflow.com/questions/306313/…
  • @Wooble 这确实是我本意要问的问题
【解决方案3】:

根据您的困惑程度,这可能会有所帮助。

这些说法是一样的:

[c for c in s if c != 'o']
[c for c in s if not c == 'o']

【讨论】:

    【解决方案4】:

    我想补充一点,他们绝对不会做同样的事情。 我会使用!=。 例如,如果你有一个 unicode 字符串......

    a = u'hello'
    'hello' is not a
    True
    'hello' != a
    False
    

    使用 !=,Python 基本上执行从 str() 到 unicode() 的隐式转换并比较它们,而使用 is 不是,如果它是完全相同的实例,则匹配。

    【讨论】:

      【解决方案5】:

      我只是引用参考, is 测试操作数是否相同,可能指的是同一个对象。其中!= 测试该值。

      s = [1,2,3]
      while s is not []:
         s.pop(0);
      

      这是一个无限循环,因为对象 s 永远不等于 [] 引用的对象,它指的是完全不同的对象。其中用s != [] 替换条件将使循环明确,因为这里我们正在比较值,当 s 中的所有值都被弹出时,剩下的是一个空列表。

      【讨论】:

        猜你喜欢
        • 2021-06-10
        • 1970-01-01
        • 2021-01-02
        • 2016-03-26
        • 2011-03-24
        • 2014-01-03
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多