Python中的非无测试
在这些测试中,并非没有Python中的非无测试,python,nonetype,Python,Nonetype,在这些测试中,并非没有 if val != None: if not (val is None): if val is not None: 哪一个更可取,为什么?后两个中的任何一个,因为val可能是定义\uuuuu eq\uuu()的类型,当传递None时返回true if val is not None: # ... Pythonic惯用法,用于测试变量是否未设置为None。这个成语在英语中有特殊的用法是在Python中测试身份。因为在运行的Python脚本/程序中存在一个且只
if val != None:
if not (val is None):
if val is not None:
哪一个更可取,为什么?后两个中的任何一个,因为
val
可能是定义\uuuuu eq\uuu()
的类型,当传递None
时返回true
if val is not None:
# ...
Pythonic惯用法,用于测试变量是否未设置为None
。这个成语在英语中有特殊的用法<代码>是在Python中测试身份。因为在运行的Python脚本/程序中存在一个且只有一个None
实例,is
是最佳测试。如前所述,这将在“规划建议”下讨论
至于为什么这是首选
if not (val is None):
# ...
这只是“可读性很重要”的一部分。好的Python通常接近于好的 应始终使用
is
或is not
进行与None等单例的比较,切勿使用相等运算符
另外,当您真正的意思是如果x不是None时,请注意编写if x
——例如,当测试默认为None的变量或参数是否设置为其他值时。另一个值的类型(如容器)在布尔上下文中可能为false
PEP 8对于任何Python程序员来说都是必不可少的阅读材料。对于这些类型的问题,最好的办法是确切地了解Python的功能。该模块的信息量惊人:
>>> import dis
>>> dis.dis("val != None")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 3 (!=)
6 RETURN_VALUE
>>> dis.dis("not (val is None)")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 9 (is not)
6 RETURN_VALUE
>>> dis.dis("val is not None")
1 0 LOAD_NAME 0 (val)
2 LOAD_CONST 0 (None)
4 COMPARE_OP 9 (is not)
6 RETURN_VALUE
请注意,最后两种情况简化为相同的操作序列,Python读取not(val为None)
并使用。第一个在与None
比较时使用
if val is not None:
# ...
正如其他答案所指出的,使用
=
与None
相比是个坏主意。那是相当卑鄙的\uuu eq\uuu()
行为,我没有考虑过。抓住一个关键问题的好答案。此外,“is not”具有为此目的而创建的特殊符号含义(这不是表达式构造的逻辑结果;“1 is(not None)”和“1 not None”有两种不同的结果。“not None”返回True.interest.@gotgenes不总是正确的。例如:var=''。如果运行此代码,它会成功地测试None。因此,您无法测试变量是否设置为None或空字符串。@Ethanval='';print(val不是None)
打印True
,那么您发现哪一部分不正确?至于为什么不建议使用val!=None
:如果val
可以是None
或更复杂的东西,比如numpy数组,则不完全清楚这是否是元素级比较(例如:arr>0
将生成一个索引列表,其中arr元素为正值),因此,如果您希望val
是一个数组或None
,那么arr is None
是最安全的测试方法。事实上,Python 2.7.6生成了一个警告,arr!=None
将在将来按元素工作。arr不是None
也更易于阅读。比较op 9和3?@evolvedmicrobe从dis doc
(),COMPARE_OP
执行与元组dis.cmp_OP=(“=”、“in”、“not in”、“is”、“not”、“exception match”、“BAD”对应的布尔运算)
。所以比较运算9
执行不是,而比较运算3
执行!=
。如果val:
,那么如何?这不是同一个测试!如果val为0,“,[],0.0.等等,那么如果如果将是false,如果val为0,“,[],0.0.等等,那么如果val为零,那么呢。