Python中is
和not
是两个关键字,而is not
的组合可以看作又一个关键字,不可以将其看作是两个关键字的简单堆砌。
1. “is” keyword
is
关键字的作用是判断两个变量是否指向同一对象,指向同一对象的意思是,两个变量在内存中指向同一块地址。
a is b
等价于id(a) == id(b)
,这里函数id()
的作用是返回变量的内存地址。
>>> a = 123
>>> b = 123
>>> a is b
True
>>> id(a)
140705145204944
>>> id(b)
140705145204944
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
>>> id(a)
2211923907528
>>> id(b)
2211926561032
>>> c = a
>>> c
[1, 2, 3]
>>> a is c
True
>>> id(c)
2211923907528
2. “not” keyword
not
关键字的作用是对一个对象进行逻辑取反。
>>> not 123
False
>>> not [1, 2, 3]
False
>>> not 0
True
>>> not None
True
值得一提的是,Python在判断一个对象的逻辑真假时,有一个 Truth Value Testing 的概念,在这里规定了如何定义一个对象的逻辑真假。
简单来说,如果一个对象:(1)内置了__bool__()
方法,且返回False
,或(2)内置了__len__()
方法,且返回0
,则在逻辑上将其视为假,否则视为真。
由此可知,以下对象均为逻辑假,使用bool()
函数测试结果均为False
(直接抄文档了):
- constants defined to be false:
None
andFalse
. - zero of any numeric type:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- empty sequences and collections:
''
,()
,[]
,{}
,set()
,range(0)
同样地,使用not
关键字测试上面的对象,结果均为True
。
3. “is not” keyword
is not
实际上是一个比较运算符,用于判断对象是否不一致。(同样地,前面的is
也是比较运算符,用于判断对象是否一致。)
is not
不应该被拆开来理解,而应视作一个整体,即:a is not b
的优先级不是a is (not b)
,而是a (is not) b
。
>>> a = 123
>>> a is not None
True
>>> a is (not None)
False
>>> bool(a) is (not None)
True
在官方文档中,对此的说明概括成了短短三句话: