楼上 @
gwki 说的很清楚了!
但是对于 None 来说有一点区别,你看很多 Python 代码就会发现:大部分情况下我们用 if foo is None 来做判断,因为 None 在 Python 中是一个全局唯一变量。官方文档中说:Since None is a singleton, testing for object identity (using == in C) is sufficient. 所以官方是推荐用 id 来 check 的。
即:None 只有一个,不存在值为 None 但是与 id(None) 不相等的情况。
写作 if foo != None 有点不 Pythonic (反正我是没这么见过哈哈哈)。
问题 2:
foo = 0
if foo 判断为假,
if foo is not None 判断为真。所以 is 判断的是 id 相同(对于 None 来说判断 id 相同和判断值相同没有太大区别,反正只有 1 个)。
所以二者是不一样的,除了 None 之外,文档(
https://docs.python.org/3.6/library/stdtypes.html#truth-value-testing )还有下面的判断为假:
- constants defined to be false: None and False.
- zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
- empty sequences and collections: '', (), [], {}, set(), range(0)
再啰嗦一点,对于不可变对象,为了避免重复创建,Python 做了驻留处理。比如下面代码:
>>> s1 = "ABC"
>>> s2 = "ABC"
>>> s1 is s2
True
但是我们实际比较二者的时候,应该用 s1 == s2。因为驻留操作是 CPython 的实现细节。副作用不应该被依赖。