在 Python 2.7 中检查字符串“None”或“not”
Posted
技术标签:
【中文标题】在 Python 2.7 中检查字符串“None”或“not”【英文标题】:Check string "None" or "not" in Python 2.7 【发布时间】:2016-06-27 09:48:39 【问题描述】:想知道if not foo is None
是否与if foo
相同?使用 Python 2.7 和 foo
是一个字符串。
【问题讨论】:
@Signal:不,他们不是。if foo is not None
只检查 foo 是否真的不是单例 None
而 if foo
检查 if bool(foo)
或 if foo.__nonzero__()
是完全不同的东西。
当字符串的len
大于0 时,bool(that_string)
返回True
。如果字符串的len
为0,则返回False
。我认为像 str 这样的内置函数没有 __nonzero__
-method,但我不确定。
对不起,我把名字弄混了……这个方法叫做__bool__
而不是__nonzero__
。
我已经上传了我的测试,你可以看看这个gist。
每个不为空的变量(如空列表/set/dict/string/...)或 0(整数、浮点数、...)或简单的 False
或 None
当用作 if variable
或 if bool(variable)
时,计算结果为 True
【参考方案1】:
对于空字符串,两者都是不同的:
foo = ''
if foo:
print 'if foo is True'
不会打印任何内容,因为它是空,因此被视为False
,但是:
if foo is not None:
print 'if not foo is None is True'
将打印,因为foo
不是无!
我根据 PEP8 更改了它。 if foo is not None
等同于您的 if not foo is None
,但更具可读性,因此被 PEP8 推荐。
更多关于 Python 的一般原则:
if a is None:
pass
如果a = None
被明确设置,if
只会是True
。
另一方面:
if a:
pass
当它是True
时有几种评估方法:
Python 尝试调用a.__bool__
,如果实现了,则使用返回的值。
None
、False
、0.0
、0
将评估为False
,因为它们的__bool__
方法返回False
。
如果a.__bool__
没有实现,那么它会检查a.__len__.__bool__
返回的内容。
''
、[]
、set()
、dict()
等将评估为 False
,因为它们的 __len__
方法返回 0
。这是False
,因为bool(0)
是False
。
如果连a.__len__
都没有实现,那么如果只返回True
。
True
。
另请参阅:您的 python 文档中的truth-value-testing。
【讨论】:
避免not X is Y
,更喜欢X is not Y
。
感谢 MSeifert,在 Python 中,任何变量(可能是字符串对象和任何其他类型的对象)都应该指向某个对象,对吗?那if X is not None
怎么会是假的呢?
MSeifert,很好的答案。但是,如果定义了 __bool__
或 __len__
,我们如何知道任何类?
help(a)
显示有关该实例的所有信息,或者尝试print a.__bool__()
或print a.__len__()
。 (或快捷方式bool(a)
、len(a)
),看看是什么引发了错误(然后它没有实现)或者它是否打印了一些东西(然后它被实现了)
啊忘记了一个明显的情况:如果这两个方法都没有定义bool(a)
,则无论如何都返回True
。【参考方案2】:
不,当 foo 为空字符串时不一样。
In [1]: foo = ''
In [2]: if foo:
...: print 1
...:
In [3]: if foo is None:
...: print 2
...:
In [4]: if not foo is None:
...: print 3
...:
3
【讨论】:
感谢天威,投赞成票。我经常看到人们写if not X
(X 可以是任何类型的对象),如果在 Python 中一个变量必须指向某个对象,if not X
怎么可能是 False?谢谢。
@LinMa,当 X 既不是 None 也不是 empty(0,[], , () 或 '') 时,if not X
将为 False。【参考方案3】:
运营商is
比较id(你可以用id(something)
检查某物的id)。因为None
只有一个实例,所以something is None
形式的任何表达式都将是False
,None is None
或something == None
除外。运算符not
has less precedence than comparisons(而is
是一个比较运算符)所以not string is None
与not (string is None)
相同的结果是总是True
。
不过,如果字符串对象不是空字符串,则将其视为True
,如果是空字符串,则视为False
。
因此,其中一个表达式始终是 True
,而另一个可以变化,所以不,它们不等价。
【讨论】:
感谢萨尔瓦,投票。我经常看到人们写if not X
(X可以是任何类型的对象),如果在Python中一个变量必须指向某个对象,if not X
怎么可能是False?谢谢。
还有萨尔瓦,对于not str is None
,not
是在str
上运行,还是not
在str is None
上运行?谢谢。
if not X
可以是False
,因为在预期布尔值这样的 if 测试的上下文中,X
被隐式转换为布尔值。管理此类转换的规则在Python online reference 中进行了总结。
@LinMa,回答你的第二个问题我意识到答案推理失败。 not
的优先级低于比较,因此 not str is None
与 not (str is None)
相同。我编辑并修复了答案。【参考方案4】:
没有。试试这个代码
foo=''
if foo:
print (1)
else:
print (2)
if not foo is None:
print (3)
else:
print (4)
它会打印出来
2
3
【讨论】:
感谢 Sci,投票。在 Python 中,任何变量(可以是字符串对象和任何其他类型的对象)都应该指向某个东西,对吗?那if X is not None
怎么会是假的呢?以上是关于在 Python 2.7 中检查字符串“None”或“not”的主要内容,如果未能解决你的问题,请参考以下文章
Python 2.7 类型提示 PyCharm 中的可调用类型
在 chrome 中自动打印/保存网页为 pdf - python 2.7