2024-09-30 03:25:03 发布
网友
Variable = None
在特定的场景中,这三者之间有什么区别吗?如果没有区别,哪一个更适合使用?
if Variable: print "Hello world"
以及
if Variable is not None: print "Hello world"
if Variable != None: print "Hello world"
在没有变量的情况下是相同的吗?
如果x为None、False、[]、{}等,则not x为真
x
None
False
[]
{}
not x
除非变量实际上是None,否则x is not None将始终是True。
x is not None
True
编辑:
这一点非常重要,只要您想检查变量是否实际设置为正确的值。否则你会遇到麻烦。例如,如果要计算项目列表并执行以下操作:
if not x:
若要检查是否提供了列表,则条件将在空列表上触发,该列表可能仍然是有效的输入。所以在这种情况下,你想和
if x is not None:
允许空列表作为有效输入,但仍要检查是否未提供任何列表。
这样的None值与某些语言中的null或nil值相当。它是一个占位符,表示定义的变量中缺少值(如果未定义,它将抛出一个NameError)。这就是为什么在某些情况下,None值被用作默认值的原因:
null
nil
NameError
>>> def foo(): ... pass ... >>> x = foo() >>> x is None True
它还经常用作可选变量的默认值:
>>> def foo(bar=None): ... if bar is None: ... print('No argument passed.') ... else: ... print('Variable bar: %s' % str(bar)) ... >>> foo(0) Variable bar: 0 >>> foo() No argument passed.
这样,0仍然是一个有效值,如果使用if not bar:检查,则该值的计算结果为False。
0
if not bar:
Is there any difference between these three in a specific scenario ?
第一个问题是变量是否有错误。除了None-False、0和任何空序列等,此测试将失败
第二个问题是它是否是神奇的单重常数None。这只会对None本身失败。
第三个问题是它是否认为自己等于None。这将失败,比如说,Holder(None),其中Holder是一个包装类,其实例与它们所持有的内容进行比较。或者,给出一个不太现实但代码更短的exmaple:
Holder(None)
Holder
class Stupid(object): def __ne__(self, other): return False Variable = Stupid()
最后一个是很少有用的;事实上,如果您认为可能需要检查== None或!= None,并且您没有专门创建透明包装类或类似的类,那么您可能实际上需要is None或is not None。但另外两个都是非常有用和常见的。
== None
!= None
is None
is not None
if there is no difference which one is more suitable to use?
嗯,有一个区别,哪一个更合适取决于具体的用途。
在问题的最后,您可能会问,在Variable肯定是None的特定情况下,是否存在任何差异。在这种情况下,三者之间当然没有功能上的区别,*它们都保证是错误的,因此什么也不做。这意味着这三种方法中的任何一种都和不写代码没有区别。更简单,可读性更强,速度更快。
Variable
*有一个性能差异第一个不需要LOAD_CONST和None,也不需要调用比较运算符。而且,即使您以某种方式重新绑定了None或更改了None常量的值(可能是用ctypes在堆中到处跺脚?),第一个更可能仍然有效。但这两种方法都不重要,如果它们真的重要,那么任何代码都不会更快、更可靠。
LOAD_CONST
ctypes
official PEP 8 recommendation是通过身份检查来测试None:
平等/不平等测试也会起作用,但速度会慢一些,而且不是惯用的方法:
测试变量的布尔值会产生不同的结果。如果变量是空容器或等于零的数字,则以下测试将打印“hello world”:
# Hello world won't print for any of these values: for Variable in (), '', u'', {}, [], 0, 0.0, 0j, None: if Variable: print "Hello world"
如果
x
为None
、False
、[]
、{}
等,则not x
为真除非变量实际上是
None
,否则x is not None
将始终是True
。编辑:
这一点非常重要,只要您想检查变量是否实际设置为正确的值。否则你会遇到麻烦。例如,如果要计算项目列表并执行以下操作:
若要检查是否提供了列表,则条件将在空列表上触发,该列表可能仍然是有效的输入。所以在这种情况下,你想和
允许空列表作为有效输入,但仍要检查是否未提供任何列表。
这样的
None
值与某些语言中的null
或nil
值相当。它是一个占位符,表示定义的变量中缺少值(如果未定义,它将抛出一个NameError
)。这就是为什么在某些情况下,None
值被用作默认值的原因:它还经常用作可选变量的默认值:
这样,
0
仍然是一个有效值,如果使用if not bar:
检查,则该值的计算结果为False
。第一个问题是变量是否有错误。除了
None
-False
、0
和任何空序列等,此测试将失败第二个问题是它是否是神奇的单重常数
None
。这只会对None
本身失败。第三个问题是它是否认为自己等于
None
。这将失败,比如说,Holder(None)
,其中Holder
是一个包装类,其实例与它们所持有的内容进行比较。或者,给出一个不太现实但代码更短的exmaple:最后一个是很少有用的;事实上,如果您认为可能需要检查
== None
或!= None
,并且您没有专门创建透明包装类或类似的类,那么您可能实际上需要is None
或is not None
。但另外两个都是非常有用和常见的。嗯,有一个区别,哪一个更合适取决于具体的用途。
在问题的最后,您可能会问,在
Variable
肯定是None
的特定情况下,是否存在任何差异。在这种情况下,三者之间当然没有功能上的区别,*它们都保证是错误的,因此什么也不做。这意味着这三种方法中的任何一种都和不写代码没有区别。更简单,可读性更强,速度更快。*有一个性能差异第一个不需要
LOAD_CONST
和None
,也不需要调用比较运算符。而且,即使您以某种方式重新绑定了None
或更改了None
常量的值(可能是用ctypes
在堆中到处跺脚?),第一个更可能仍然有效。但这两种方法都不重要,如果它们真的重要,那么任何代码都不会更快、更可靠。official PEP 8 recommendation是通过身份检查来测试None:
平等/不平等测试也会起作用,但速度会慢一些,而且不是惯用的方法:
测试变量的布尔值会产生不同的结果。如果变量是空容器或等于零的数字,则以下测试将打印“hello world”:
相关问题 更多 >
编程相关推荐