为什么要避免使用"是"并且"不是"?

时间:2014-11-06 11:42:19

标签: javascript python

我刚开始使用Python,我的在线教授建议仅在将值与isis notTrue进行比较时才使用FalseNone(或者至少这就是我理解他所说的话。)

现在在我的脑海中,我将is与JavaScript ===is not等同于JavaScript "!==",我认为它被认为是使用{的最佳做法{1}}和===尽可能多地避免强制类型转换。

首先,我们不想在JavaScript中使用!==is以及is not===这是真的,如果那么,为什么不呢?

3 个答案:

答案 0 :(得分:2)

Python的is==运算符执行两项不同的操作。您也无法将is与JS ===进行比较。

简单地说,==测试两个标识符是否相等,而is测试两个标识符是否具有相同的内存地址,因此是否"它们是彼此&#34 ;;他们表现的方式就像听起来一样:

#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

答案 1 :(得分:1)

None是一个单身人士,因此您可以比较对象身份is / is not)而不是相等({ {1}} / ==) - 无论何时访问!=,您都会获得相同的对象

对于几乎所有其他情况,您应该使用相等(参见例如Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?)。对于"避免强制类型转换" - Python 强类型并且永远不会隐式转换。此外,你不能真正"演员" Python中的一种类型 - 转换为例如Noneint会创建一个新的独立对象。

这一点尤其重要,因为str通常用于标记无回报 - 如果NoneFalse0或其他任何内容评估[] - y是有效回报,评估"真实性"会产生误导性的结果。

False

the style guide

  

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 ... 等单身人士的比较应始终使用Noneis,而不是等同运算符。

     

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


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

  

不要使用False将布尔值与TrueFalse进行比较。

==

另请参阅:Use of True, False, and None as return values in python functions

答案 2 :(得分:0)

我们不应该使用isis not来比较TrueFalseNone以外的值,可能是因为以下奇怪结果:

>>> 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