刚写Python那会,我老被一个问题折腾。判断一个列表是不是空,有人写 if not list,有人写 if list is None。看着差不多,结果撞上None就炸了锅。今天把这个坑填平。
先记住一句话:空列表不是None。[]是个空容器,None是个啥都没有的占位符。你问一个空列表“你在吗”,它回答“在,但里面没东西”。你问None,它直接不说话。
实际写代码最容易翻车的地方是函数返回值。假设有个函数get_items(),有时返回列表,有时返回None。新手判定数据时写 if not result,这下完了。空列表会走进去,None也会走进去。你想处理的是“没数据”,结果空列表被当成“没数据”吃掉了。
正确做法是分开处理。先判断是不是None,再判断列表是不是空。举个真例子:
if result is None:
print('函数没跑通')
elif not result:
print('函数跑通了,但没捞到数据')
else:
print('有数据,处理它')
有人嫌麻烦,写一行 if not result 全搞定。短是短了,逻辑就乱了。你分不清是系统出错了还是确实没数据。系统出错了你要告警,没数据你静静处理就行。糊在一起,排查问题得翻半天日志。
再举个你天天见的场景:从数据库查记录。查到了返回列表,查不到返回空列表,连接断了返回None。这时候要是用 if not data 去判断,连接断了你也当成“没数据”处理。该报异常的事被你静默了。线上出问题根本找不到原因。
还有一种情况是默认参数。函数定义参数默认值,很多人写def func(items=[])。这个坑更大,默认列表是可变对象,多次调用会共享。正确写法是 def func(items=None),然后在函数内部处理。处理时就用到上面的判空逻辑。
写代码要像跟人说话。None就是个人不在家,空列表是人在家但屋里空荡荡。两个状态得分开对待。if not xxx这种写法简洁,但只适合确认存在性。想判断“有没有数据”,就得老老实实写两段。
最后一个提醒:别在if条件里直接写if list == []。这样写不是不行,但可读性差。别人看到要反应一下“哦这是在判断空列表”。if not list 一眼就知道是判空。if list is None 一眼就知道是判None。写代码是给人看的,别装酷。
下次再遇到判空场景,停一秒想想。这个变量到底可能是什么状态。把None和空列表分开,你的代码就稳了一大半。