先来一段代码大家可以先猜猜输出是什么?
l = []
l == []
l is []
l == None
bool(l)
if not l:
print "空"
if l is None:
print "空"
答案如下:
l = []
1. l == []
True
2. l is []
False
3. l == None
False
4. bool(l)
False
5. if not l:
print "空"
空
6. if l is None:
print "空"
没有输出
很多初学者包括我,以为1和2的输出都是 True,因为觉得在python中is和==是一样的用法的
其实在python中 ==
仅仅对比对象的值,如果两个对象值相同,而地址不同,==
也是成立的;而is
是对比对象的地址,如果地址一致的话,值自然就一致了,所以is
是完全相等
至于如何查看对象的地址,使用id()
即可
对于3和4, 比较容易让人误解的是3, 以为[]
就是None
,都是没有嘛,哈哈
4的话解释一下, 在python中,空对象、值为0的任何数字(包括整数、浮点数、复数)或者None对象的bool值都是False,其余对象都是True,4是属于空对象,空列表嘛。
56的话我比较容易混淆。我会常常以为5和6是一致的.一个很好的实践是在写if判断时脑补一下bool(statement),像5的话脑补成
if bool(not l)
print "空"
6脑补成
if bool(l is None)
print "空"
5是因为l是空对象,空对象的bool值是False,取反是True;
6是因为l is None, l并不等于None,bool值是False
这样的话就容易理解多了.
结论:
is
是对比对象的地址,是python当中的全等==
仅仅是对比对象的值- 在python中,空对象、值为0的任何数字(包括整数、浮点数、复数)或者None对象的bool值都是False,其余对象都是True
- 使用if语句时,为了避免混淆,先脑补成if bool(statement)