我刚开始使用Python,我的在线教授建议仅在将值与is
,is not
或True
进行比较时才使用False
和None
(或者至少这就是我理解他所说的话。)
现在在我的脑海中,我将is
与JavaScript ===
和is not
等同于JavaScript "!=="
,我认为它被认为是使用{的最佳做法{1}}和===
尽可能多地避免强制类型转换。
首先,我们不想在JavaScript中使用!==
和is
以及is not
和===
这是真的,如果那么,为什么不呢?
答案 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中的一种类型 - 转换为例如None
到int
会创建一个新的独立对象。
这一点尤其重要,因为str
通常用于标记无回报 - 如果None
或False
或0
或其他任何内容评估[]
- y是有效回报,评估"真实性"会产生误导性的结果。
False
与
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 ...
等单身人士的比较应始终使用None
或is
,而不是等同运算符。另外,请注意
is not
,如果你的意思是if x
- 例如在测试默认为x is not None
的变量或参数是否设置为其他值时。另一个值可能有一个类型(如容器),在布尔上下文中可能为false!
请注意,您通常不比较None
或True
。再次,从风格指南:
不要使用
False
将布尔值与True
或False
进行比较。==
另请参阅:Use of True, False, and None as return values in python functions
答案 2 :(得分:0)
我们不应该使用is
和is not
来比较True
,False
和None
以外的值,可能是因为以下奇怪结果:
>>> 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