Python中的null对象?
我如何在中引⽤对象?
#1楼
在Python中,为了表⽰缺少值,可以对对象使⽤None值( types.NoneType.None ),对字符串使⽤“” (或len()== 0 )。 因此:
if yourObject is None: # if yourObject == None:
...
if yourString == "": # if yourString.len() == 0:
...
关于“==”和“is”之间的区别,使⽤“==”测试对象标识应该⾜够了。 但是,由于操作“is”被定义为对象标识操作,因此使⽤它可能更正确,⽽不是“==”。 不确定是否有速度差异。
⽆论如何,你可以看看:
Python doc页⾯。
Python ⽂档页⾯。
#2楼
在Python中,'null'对象是单例None 。
检查“⽆效”的最佳⽅法是使⽤⾝份运算符, is :
if foo is None:
...
#3楼
它不像其他语⾔那样被称为null,但是 。 此对象始终只有⼀个实例,因此,如果需要,可以检查x is None等效性x is None (⾝份⽐较)⽽不是x == None 。
#4楼
Per ,'None'直接测试为FALSE,因此最简单的表达式就⾜够了:
if not foo:
#5楼
None ,Python是null?
Python中没有null ,⽽是None 。 如前所述最准确的⽅法来测试的东西已被赋予None作为值是使⽤is⾝份运营商,测试这两个变量指向同⼀个对象。
True
>>> foo = 'bar'
>>> foo is None
Fal
基础
有,只能是⼀个None
None是NoneType类的唯⼀实例,并且实例化该类的任何进⼀步尝试都将返回相同的对象,这使得None成为单例。 Python的新⼿经常会看到提及NoneType错误消息,并想知道它是什么。 这是我个⼈的看法是,这些消息可能只是简单地提到None以名,因为我们很快就会看到, None叶的⼩房间歧义。 所以,如果你看到⼀些TypeError消息提到NoneType不能做到这⼀点还是不能做到这⼀点,只知道它只是⼀个None正被在某种程度上使⽤,它不能。
此外, None是⼀个内置常量,只要你启动Python,它就可以在任何地⽅使⽤,⽆论是在模块,类还是函数中。 NoneType相⽐之下是不是,你需要先通过查询得到它的引⽤None为它的类。
>>> NoneType
NameError: name 'NoneType' is not defined
>>> type(None)
NoneType
您可以使⽤Python的标识函数id()检查None的唯⼀性。 它返回分配给对象的唯⼀编号,每个对象都有⼀个。 如果两个变量的id相同,那么它们实际上指向同⼀个对象。
>>> NoneType = type(None)
>>> id(None)
10748000
>>> my_none = NoneType()
>>> id(my_none)
10748000
>>> another_none = NoneType()
>>> id(another_none)
10748000
>>> def function_that_does_nothing(): pass
>>> return_value = function_that_does_nothing()
>>> id(return_value)
10748000
None不能被覆盖
在更旧版本的Python(2.4之前)中,可以重新分配None ,但不能再重新分配。 甚⾄不是作为类属性或在函数的范围内。
>>> class SomeClass(object):
... def my_fnc(lf):
... lf.None = 'foo'
SyntaxError: cannot assign to None
>>> def my_fnc():
None = 'foo'
SyntaxError: cannot assign to None
# In Python 3.5
>>> class SomeClass:
... def my_fnc(lf):
... lf.None = 'foo'
SyntaxError: invalid syntax
>>> def my_fnc():
None = 'foo'
SyntaxError: cannot assign to keyword
因此可以安全地假设所有None引⽤都是相同的。 没有“⾃定义” None 。要测试None使⽤is运算符
在编写代码时,您可能会尝试像这样测试Noneness :
if value==None:
pass
或者像这样测试虚假
if not value:
pass
您需要了解其含义以及为什么明确这⼀点通常是⼀个好主意。
案例1:测试值是否为None
为什么这样做
value is None
⽽不是
value==None
第⼀个相当于:
id(value)==id(None)
⽽表达式value==None实际上是这样应⽤的
value.__eq__(None)
如果值真的是None那么你将得到你所期望的。
>>> nothing = function_that_does_nothing()
>>> nothing.__eq__(None)
True
在⼤多数常见情况下,结果将是相同的,但__eq__()⽅法打开了⼀扇门,⽆法保证准确性,因为它可以在类中被覆盖以提供特殊⾏为。
考虑这个课程。
>>> class Empty(object):
... def __eq__(lf, other):
... return not other
所以你在None上尝试它并且它有效
>>> empty = Empty()
>>> empty==None
True
但是它也适⽤于空字符串
>>> empty==''
True
但是
>>> ''==None
Fal
>>> empty is None
Fal
情况2:使⽤None作为布尔值
以下两个测试
if value:
# do something
if not value:
# do something
实际上被评估为
if bool(value):
# do something
if not bool(value):
# do something
None是“faly”,意味着如果转换为布尔值,它将返回Fal ,如果应⽤not运算符,它将返回True 。 但请注意,它不是None独有的属性。 除了Fal本⾝之外,该属性由空列表,元组,集合,dicts,字符串以及0以及实现__bool__()魔术⽅法的类中的所有对
象__bool__()以返回Fal 。
>>> bool(None)
Fal
>>> not None
True
>>> bool([])
Fal
>>> not []
True
>>> class MyFaly(object):
... def __bool__(lf):
... return Fal
>>> f = MyFaly()
>>> bool(f)
Fal
>>> not f
True
因此,当以下列⽅式测试变量时,请特别注意您在测试中包含或排除的内容:
def some_function(value=None):
if not value:
value = init_value()
在上⾯,你的意思是当值专门设置为None时调⽤init_value() ,或者你的意思是设置为0的值,或空字符串,或空列表也应该触发初始化。就像我说的那样,要⼩⼼。 因为Python中的情况通常⽐隐式更好 。
在实践中None
None⽤作信号值
None在Python中具有特殊状态。 它是最受欢迎的基准值,因为许多算法将其视为特殊值。 在这种情况下,它可以⽤作标志,表⽰条件需要⼀些特殊处理(例如设置默认值)。
您可以将None分配给函数的关键字参数,然后显式测试它。
def my_function(value, param=None):
if param is None:
# do something outrageous!
您可以在尝试获取对象的属性时将其作为默认值返回,然后在执⾏特殊操作之前显式测试它。
value = getattr(some_obj, 'some_attribute', None)
if value is None:
# do something spectacular!
默认情况下,字典的get()⽅法在尝试访问不存在的键时返回None :
>>> some_dict = {}
>>> value = ('foo')
>>> value is None
True
如果您尝试使⽤下标表⽰法来访问它,则会引发KeyError