Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的非无测试_Python_Nonetype - Fatal编程技术网

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或空字符串。@Ethan
val='';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为零,那么
呢。