Skip to content

Latest commit

 

History

History
91 lines (70 loc) · 2.49 KB

null_object_in_python.md

File metadata and controls

91 lines (70 loc) · 2.49 KB

在Python中,对应于其他语言的null使用的是关键字None:

if foo is None:
    ...
>>> foo is None
True
>>> foo = 'bar' 
>>> foo is None
False

在Python惯例中,使用is来检查变量是否没有设置成None这个管理在案例declaring keyword functions with default parameters有详细说明。is检查的是标识,这是因为在Python程序中None只有一个实例,所以is用来检查。

所以检查一个变量不是None的时候,我们会使用(参考Zen of Python):

if not (val is None):
    # ...

None的详解

  • There is and can only be one None

在Python中,None是类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 cannot be overwritten

在早期的Python(2.4之前)可以重新设置None,但是现在不能:

# In Python 2.7
>>> class SomeClass(object):
...     def my_fnc(self):
...             self.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(self):
...             self.None = 'foo'
SyntaxError: invalid syntax
>>> def my_fnc():
        None = 'foo'
SyntaxError: cannot assign to keyword

这就确保了None的引用是相同的,没有"定制"的None

  • To test for None use the is operator

要检查是否是None需要使用关键字is,不要使用==

参考