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模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
django之常用命令详解
Jun 30 Python
Python实现调度算法代码详解
Dec 01 Python
python实现数据库跨服务器迁移
Apr 12 Python
opencv python 2D直方图的示例代码
Jul 20 Python
Python 处理图片像素点的实例
Jan 08 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 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
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
Django中处理出错页面的方法
2015/07/15 Python
Python科学计算之Pandas详解
2017/01/15 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
在django模板中实现超链接配置
2019/08/21 Python
python实现横向拼接图片
2020/03/23 Python
PyQt5实现简单的计算器
2020/05/30 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
工地资料员岗位职责
2013/12/31 职场文书
优秀部门获奖感言
2014/02/14 职场文书
倡议书的格式写法
2015/04/28 职场文书
开学第一周总结
2015/07/16 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript