我不清楚语法!=
和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
包含在第一个列表中,而不包含在第二个列表中?
答案 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()的隐式转换并比较它们,而如果不是,则匹配它是否完全相同的实例。