python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍


Posted in Python onSeptember 21, 2016

代码中经常会有变量是否为None的判断,有三种主要的写法:
第一种是`if x is None`;
第二种是 `if not x:`;
第三种是`if not x is None`(这句这样理解更清晰`if not (x is None)`) 。
如果你觉得这样写没啥区别,那么你可就要小心了,这里面有一个坑。先来看一下代码:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]     # You don't want to fall in this one.
>>> not x
False

在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False ,即:

not None == not False == not '' == not 0 == not [] == not {} == not ()

因此在使用列表的时候,如果你想区分x==[]和x==None两种情况的话, 此时`if not x:`将会出现问题:

>>> x = []
>>> y = None
>>> 
>>> x is None
False
>>> y is None
True
>>> 
>>> 
>>> not x
True
>>> not y
True
>>> 
>>> 
>>> not x is None
>>> True
>>> not y is None
False
>>>

也许你是想判断x是否为None,但是却把`x==[]`的情况也判断进来了,此种情况下将无法区分。
对于习惯于使用if not x这种写法的pythoner,必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
而对于`if x is not None`和`if not x is None`写法,很明显前者更清晰,而后者有可能使读者误解为`if (not x) is None`,因此推荐前者,同时这也是谷歌推荐的风格

结论:
`if x is not None`是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。
使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。

================================================================
不过这并不适用于变量是函数的情况,以下转载自:https://github.com/wklken/stackoverflow-py-top-qa/blob/master/contents/qa-control-flow.md

foo is None 和 foo == None的区别

问题 链接

if foo is None: pass
if foo == None: pass

如果比较相同的对象实例,is总是返回True 而 == 最终取决于 "eq()"

>>> class foo(object):
  def __eq__(self, other):
    return True

>>> f = foo()
>>> f == None
True
>>> f is None
False

>>> list1 = [1, 2, 3]
>>> list2 = [1, 2, 3]
>>> list1==list2
True
>>> list1 is list2
False

另外

(ob1 is ob2) 等价于 (id(ob1) == id(ob2))

################################################################################
补充,2013.10.09
转自http://zhidao.baidu.com/question/514056244.html

python中的not具体表示是什么,举个例子说一下,衷心的感谢

在python中not是逻辑判断词,用于布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法:
(1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号后面的语句。比如:
a = False
if not a: (这里因为a是False,所以not a就是True)
print "hello"
这里就能够输出结果hello
(2) 判断元素是否在列表或者字典中,if a not in b,a是元素,b是列表或字典,这句话的意思是如果a不在列表b中,那么就执行冒号后面的语句,比如:
a = 5
b = [1, 2, 3]
if a not in b:
print "hello"
这里也能够输出结果hello

not x 意思相当于 if x is false, then True, else False

Python 相关文章推荐
Python getopt模块处理命令行选项实例
May 13 Python
python 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
python实现bucket排序算法实例分析
May 04 Python
Python文件和流(实例讲解)
Sep 12 Python
彻底理解Python list切片原理
Oct 27 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
PageFactory设计模式基于python实现
Apr 14 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
python中 .npy文件的读写操作实例
Apr 14 Python
python if not in 多条件判断代码
Sep 21 #Python
python中range()与xrange()用法分析
Sep 21 #Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 #Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 #Python
浅析Python中MySQLdb的事务处理功能
Sep 21 #Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 #Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 #Python
You might like
Zerg剧情介绍
2020/03/14 星际争霸
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
vue实现扫码功能
2020/01/17 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
python实现简单成绩录入系统
2019/09/19 Python
python3 简单实现组合设计模式
2020/07/02 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
汉语言文学毕业生求职信
2013/10/01 职场文书
项目合作计划书
2014/01/09 职场文书
安全生产演讲稿
2014/05/09 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
angular4实现带搜索的下拉框
2022/03/25 Javascript