Check string “None” or “not” in Python 2.7
想知道if not foo is None是否与if foo相同?使用python 2.7和foo是一个字符串。
- @信号:不,他们没有。if foo is not None只检查foo是否真的不是单体None,而if foo检查if bool(foo)或if foo.__nonzero__()两者完全不同。
- @mseeft,不错的帖子,对于python中的字符串,if bool(foo)和if foo.__nonzero__()意味着什么?
- 当字符串的len大于0时,bool(that_string)返回True。如果字符串的len为0,则返回False。我认为对于像str这样的内置设备,没有__nonzero__方法,但我不确定。
- 对不起,我把名字弄混了…该方法称为__bool__,而不是__nonzero__。
- @米西弗,谢谢,投票决定。你的意思是只有一个方法__bool__在我使用if foo时被调用吗?
- 我上传了我的测试,你可以检查一下这个要点。
- @mseift,很好的例子,我想知道任何变量,__bool__做什么?我经常看到人们使用if not X来检查空值或不检查任何对象。
- 当用作if variable或if bool(variable)时,不为空(如空的list/set/dict/string/…)或0(integer,float,…)或仅为False或None的每个变量都会计算为True。
- @有点迷路了,你是说if None还True吗?
- 我更新了我的答案,以便进一步解释。
- 在python中检查字符串是否为空的最优雅的方法可能是重复的?
对于空字符串,两者都不同:
1 2 3
| foo = ''
if foo:
print 'if foo is True' |
不会打印任何内容,因为它是空的,因此被视为False,但:
1 2
| 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中的一般原则:
如果明确设置了a = None,则if仅为True。
另一方面:
当它是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文档中的真值测试。
- 避开not X is Y,优先选择X is not Y。
- 谢谢,我已经更新了答案。
- 感谢msieft,在python中,任何变量(可能是字符串对象和任何其他类型的对象)都应该指向某个对象,对吗?那么,if X is not None怎么可能是假的呢?
- 小姐,回答得很好。但是,如果定义了__bool__或__len__,对于任何类,我们如何知道?
- help(a)向您显示有关该实例的所有信息,或者只尝试print a.__bool__()或print a.__len__()。(或者是快捷键bool(a)、len(a),看看是什么导致了错误(那么就没有实现),或者是打印了什么(那么就实现了)。
- 好主意,继续投票。我经常看到人们编写if not X(x可以是任何定制的类类型)来检查对象是否为空,我不知道他们是否定义了__bool__或len对象?想知道这种写作风格/方法是否正确?谢谢。
- 啊,忘记了明显的情况:如果没有定义这两个方法中的任何一个,那么不管怎样,只要返回True。
不,当foo是空字符串时不一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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怎么可能是假的?谢谢。
- @linma,当x既不为none也不为空(0、[]、、()或'')时,if not X将为false。
operator is比较id(您可以使用id(something)检查某个对象的id)。由于None只有一个实例,因此任何形式的something is None表示都将是False,None is None或something == None除外。运算符not的优先级低于比较运算符(is是比较运算符),因此与not (string is None)相同的not string is None的结果始终是True。
然而,如果字符串对象不是空字符串,则认为它是True;如果字符串对象是空字符串,则认为它是False。
因此,其中一个表达式总是True,另一个表达式可以变化,所以不,它们不是等价的。
- 谢谢萨尔瓦,投票吧。我经常看到人们编写if not X(x可以是任何类型的对象),如果在python中一个变量必须指向某个对象,那么if not X怎么可能是假的?谢谢。
- 萨尔瓦多,对于not str is None,not在str上运行,还是not在str is None上运行?谢谢。
- if not X可以是False,因为在期望布尔值的上下文中,如if测试,X被隐式转换为布尔值。控制此类转换的规则在python联机参考中进行了总结。
- @林玛,回答你的第二个问题,我发现答案推理有问题。not的优先级低于比较,因此not str is None与not (str is None)相同。我编辑并修正答案。
不,试试这个代码
1 2 3 4 5 6 7 8 9
| foo=''
if foo:
print (1)
else:
print (2)
if not foo is None:
print (3)
else:
print (4) |
它会打印出来
- 谢谢科学,投票吧。在Python中,任何变量(可以是字符串对象和任何其他类型的对象)都应该指向某个对象,对吗?那么,if X is not None怎么可能是假的呢?