2014-11-06 63 views
3

我刚开始使用Python和建议利用isis not我在网上教授的值进行比较True时,才False,或None(或者至少是我明白他在说什么。)为什么要避免使用“是”和“不是”?

现在在我的头,我把is与JavaScript ===is not和JavaScript "!=="等同起来,我认为最好的做法是尽量多地使用===!==以避免强制类型转换。

首先,我们不想在JavaScript中使用isis not多达===!==,如果是这样,为什么不呢?

+9

''''''不''完全不能与Javascript的'==='/'!=='相媲美。 – interjay 2014-11-06 11:44:49

+0

请参阅[本](http://stackoverflow.com/a/2988117/2206044)。 – Azar 2014-11-06 11:45:42

+0

技术上,'is'和'not''和JavaScript中的'==='和'!=='是一样的。 JavaScript中的'==='和'!=='检查对象上的身份相等性。它恰好发生在Python中的数字和字符串上,因为Python中的数字和字符串都是对象,与JavaScript中的数字和字符串不同。 – rightfold 2014-11-06 12:08:25

回答

1

None是一个单,这样你可以比较反对身份is/is not),而不是平等==/!=) - 每当你访问None,你得到同一个对象

对于几乎所有其他情况下,你应该用平等的(见例如Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?)。在术语“避免[和]强制类型转换” - Python是强类型,绝不会隐式转换。另外,你不能在Python中真正“投射”一种类型 - 例如转换一个intstr创建一个新的,单独的对象。如果False0[]或其他任何评估False -y是有效返回,评估“感实性”将会给误导的结果 -

None通常用来标记师妹这一点尤为重要。

def yes_or_no(s): 
    """Convert 'yes' or 'no' to boolean, or implicitly return None.""" 
    if s.lower() == "yes": 
     return True 
    elif s.lower() == "no": 
     return False 

result = some_func("foo") 

if result: # wrong, covers None and False 
    ... 

if result is not None: # right, covers None only 
    ... 

the style guide

比较像None单身应始终isis not,从来没有平等的运营商来完成。

此外,提防写if x当你真正的意思是,如果x is not None - 例如当测试一个变量或参数默认为None是否被设置为某个其他值时。另一个值可能有一个类型(如容器),在布尔上下文中可能为false!


请注意,您通常比较TrueFalse。再次,从风格指南:

不要布尔值比较TrueFalse使用==来。

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

参见:Use of True, False, and None as return values in python functions

+1

检查平等会给误导结果。你确定吗?你的例子('如果结果')测试平等(vs *真实性*)?否则,很好的概述 – goncalopp 2014-11-06 11:55:52

+0

我觉得'some_func'应该是'yes_or_no' – Elisha 2014-11-06 11:57:14

+0

@goncalopp这是一个很好的观点,我会尝试澄清 – jonrsharpe 2014-11-06 11:57:41

2

Python的is==运营商做两个不同的东西。你也不能比较is和JS的===

简单地说,==测试两个标识符是否相等,而is测试两个标识符是否具有相同的存储器地址,因此是否“它们是彼此”;他们的行为方式就像它的声音:

#0 equals None, so returns True 
0 == None 

#But it isn't None, hence returns False 
0 is None 

#However, 0 is 0, so returns True 
0 is 0 
+0

考虑在Javascript中添加一些示例来说明'==='和'is'运算符'不能比较“,如你所述。迄今为止给出的所有答案都可以说是不完整的,因为它们只解释了问题的Python方面,而没有说明JS和Python在这种情况下究竟有什么不同。 – SeldomNeedy 2015-10-16 19:23:48

0

我们不应该使用isis notTrueFalseNone,因为下面的怪异结果可能相互比较值:

>>> 20 is 19+1 
True 
>>> 19+1 is 20 
True 
>>> 1999+1 is 2000 
False 
>>> -0 is 0 
True 
>>> -0.0 is 0.0 
False 
>>> -0.0 is not 0.0 
True 
>>> 1999+1 is not 2000 
True 
>>> -0.0 == 0.0 
True 
>>> 1999+1 == 2000 
True 
>>> 1999+1 != 2000 
False 
>>> -0.0 != 0.0 
False 
相关问题