【发布时间】: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 = 257457895426;b = 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