Python:!=和“不是”之间的区别

时间:2011-04-25 19:20:09

标签: python syntax list-comprehension

我不清楚语法!=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包含在第一个列表中,而不包含在第二个列表中?

5 个答案:

答案 0 :(得分:31)

is测试对象标识,但==测试对象值相等:

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

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

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

答案 1 :(得分:8)

is not比较参考文献。 ==比较值

答案 2 :(得分:1)

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

这些陈述是相同的:

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

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

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

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