我如何在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,但是None 。 此对象始终只有一个实例,因此,如果需要,可以检查x is None等效性x is None (身份比较)而不是x == None


#4楼

Per Truth值测试 ,'None'直接测试为FALSE,因此最简单的表达式就足够了:

if not foo:

#5楼

None ,Python是null?

Python中没有null ,而是None 。 如前所述最准确的方法来测试的东西已被赋予None作为值是使用is身份运营商,测试这两个变量指向同一个对象。

>>> foo is None
True
>>> foo = 'bar'
>>> foo is None
False

基础

有,只能是一个None

NoneNoneType类的唯一实例,并且实例化该类的任何进一步尝试都将返回相同的对象,这使得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 ,但不能再重新分配。 甚至不是作为类属性或在函数的范围内。

# 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

要测试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__(self, other):
...         return not other

所以你在None上尝试它并且它有效

>>> empty = Empty()
>>> empty==None
True

但是它也适用于空字符串

>>> empty==''
True

但是

>>> ''==None
False
>>> empty is None
False

情况2:使用None作为布尔值

以下两个测试

if value:# do somethingif not value:# do something

实际上被评估为

if bool(value):# do somethingif not bool(value):# do something

None是“falsey”,意味着如果转换为布尔值,它将返回False ,如果应用not运算符,它将返回True 。 但请注意,它不是None独有的属性。 除了False本身之外,该属性由空列表,元组,集合,dicts,字符串以及0以及实现__bool__()魔术方法的类中的所有对象__bool__()以返回False

>>> bool(None)
False
>>> not None
True>>> bool([])
False
>>> not []
True>>> class MyFalsey(object):
...     def __bool__(self):
...         return False
>>> f = MyFalsey()
>>> bool(f)
False
>>> 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 = some_dict.get('foo')
>>> value is None
True

如果您尝试使用下标表示法来访问它,则会引发KeyError

>>> value = some_dict['foo']
KeyError: 'foo'

同样,如果您尝试弹出不存在的项目

>>> value = some_dict.pop('foo')
KeyError: 'foo'

您可以使用通常设置为None的默认值来抑制

value = some_dict.pop('foo', None)
if value is None:# booom!

None用作标志和有效值

当不被认为是有效值时,上述None应用适用,但更像是做特殊事情的信号。 然而,在某些情况下,有时候知道None来自哪里是很重要的,因为即使它被用作信号,它也可能是数据的一部分。

当您使用getattr(some_obj, 'attribute_name', None)查询对象getattr(some_obj, 'attribute_name', None)返回None不会告诉您您尝试访问的属性是否设置为None或者该对象是否完全不存在。 从some_dict.get('some_key')这样的字典访问密钥时,你不知道some_dict['some_key']是否缺失,或者它是否只是设置为None 。 如果您需要该信息,通常的处理方法是直接尝试从try/except结构中访问属性或键:

try:# equivalent to getattr() without specifying a default# value = getattr(some_obj, 'some_attribute')value = some_obj.some_attribute# now you handle `None` the data hereif value is None:# do something here because the attribute was set to None
except AttributeError:# we're now hanling the exceptional situation from here.# We could assign None as a default value if required.value = None # In addition, since we now know that some_obj doesn't have the# attribute 'some_attribute' we could do something about that.log_something(some_obj)

与dict类似:

try:value = some_dict['some_key']if value is None:# do something here because 'some_key' is set to None
except KeyError:# set a default value = None# and do something because 'some_key' was missing# from the dict.log_something(some_dict)

以上两个例子说明了如何处理对象和字典的情况,那么函数呢? 同样的事情,但我们使用双asterisks关键字参数:

def my_function(**kwargs):try:value = kwargs['some_key'] if value is None:# do something because 'some_key' is explicitly # set to Noneexcept KeyError:# we assign the defaultvalue = None# and since it's not coming from the caller.log_something('did not receive "some_key"')

None仅用作有效值

如果您发现您的代码充满了上面的try/except模式,只是为了区分None flags和None data,那么只需使用另一个测试值。 有一种模式,其中超出有效值集的值作为数据结构中的一部分插入,用于控制和测试特殊条件(例如边界,状态等)。 这样的值称为哨兵 ,可以使用None作为信号的方式。 在Python中创建一个哨兵是微不足道的。

undefined = object()

上面的undefined对象是唯一的,并且不会对程序可能感兴趣的任何内容做很多事情,因此它是None作为标志的绝佳替代品。 一些警告适用,更多关于代码之后的注意事项。

有功能

def my_function(value, param1=undefined, param2=undefined):if param1 is undefined:# we know nothing was passed to it, not even Nonelog_something('param1 was missing')param1 = Noneif param2 is undefined:# we got nothing here eitherlog_something('param2 was missing')param2 = None

用dict

value = some_dict.get('some_key', undefined)
if value is None:log_something("'some_key' was set to None")if value is undefined:# we know that the dict didn't have 'some_key'log_something("'some_key' was not set at all")value = None

有了一个对象

value = getattr(obj, 'some_attribute', undefined)
if value is None:log_something("'obj.some_attribute' was set to None")
if value is undefined:# we know that there's no obj.some_attributelog_something("no 'some_attribute' set on obj")value = None

正如我之前提到的,定制哨兵有一些警告。 首先,它们不是像None这样的关键字,所以python不保护它们。 您可以随时在其定义的模块中覆盖undefined上述undefined ,因此请小心如何公开和使用它们。 接下来, object()返回的实例不是单例,如果您进行10次调用,则会得到10个不同的对象。 最后,使用哨兵是非常特殊的。 哨兵特定于其使用的库,因此其范围通常应限于图书馆的内部。 它不应该“泄漏”出来。 如果外部代码的目的是扩展或补充库的API,那么外部代码应该只知道它。

Python中的null对象?相关推荐

  1. python的none是什么-python中的null与none有什么区别

    Python中none与null的区别有:none可以看作是一个具体的值用来初始化变量,而null表示空不是一个值,并且没有与任何一个值绑定并且存储空间也没有存储值 Python中所有的操作都是针对对 ...

  2. python list存储对象_《python解释器源码剖析》第4章--python中的list对象

    4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...

  3. python字符串代码对象_Python源码剖析 - Python中的字符串对象

    1. 前言 我们已经在 [Python中的整数对象] 章节中对定长对象进行了详细的讲解,接下来我们将介绍变长对象,而字符串类型,则是这类对象的典型代表. 这里必须先引入一个概念: Python 中的变 ...

  4. python nonetype_理解Python中的NoneType对象

    编译:老齐 在C.Java等类型的语言中,都有null,它常常被定义为与0等效.但是,在Python中并非如此.Python中用关键词None表征null对象,它并不是0,它是Python中的第一类对 ...

  5. python语言中一切皆对象_2 python 中一切皆对象

    python 中一皆对象 在 python 编程语言中所有的一切都是对象 , python 语言相对于 C++ 或 java 这样的语言 (静态语言), 面向对象这个思想更加的彻底. 2.1 函数和类 ...

  6. 获取Python中的所有对象属性?

    本文翻译自:Get all object attributes in Python? Is there a way to get all attributes/methods/fields/etc. ...

  7. python一切皆对象的理解_在 Python 中万物皆对象

    在 Python 中一切都是对象,并且几乎一切都有属性和方法.所有的函数都有一个内置的 __doc__ 属性,它会返回在函数源代码中定义的 doc string:sys 模块是一个对象,它有一个叫作 ...

  8. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  9. python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...

最新文章

  1. JavaScript基础学习--事件代理
  2. VC中栈溢出/Stack overflow怎么办?
  3. c#NPOI导出2007版本excel
  4. springboot websocket发送和接收消息代码资源下载
  5. C++实现字符串分割函数split()
  6. js处理富文本编辑器转义、去除转义、去除HTML标签
  7. Linux错误 libXext.so.6: cannot open shared object file
  8. CEF与JavaScript交互读取电脑信息
  9. 安卓一键清理内存_教大家安卓怎么清理内存-装修攻略
  10. 【Android】【移动应用开发】基础知识
  11. Wireshark使用教程用户手册
  12. 同构数怎么判断_判断同构数C语言
  13. Word如何插入分数
  14. Windows+Nvdia显卡配置Tensorflow
  15. 【轻博客观察之二】十问Tumblr
  16. 苹果召回MacBook Air 内地官网声明用英文遭指责
  17. 笔记本计算机没有声音是怎么回事,笔记本电脑声音没了怎么恢复_笔记本怎么没有声音-win7之家...
  18. 区块链与大数据结合分析
  19. 无法打开因为apple无法检查其是否包含恶意软件_最全汇总:iPhone 无法充电或充电缓慢的原因及解决办法...
  20. 【Pyecharts50例】图表背景颜色设置

热门文章

  1. RHCS的整理归纳与实践
  2. jsp中excel文件的创建与读取
  3. 步长条件梯度下降算法步长和收敛条件的设置的一些看法
  4. Pa2 函数指针 指针函数 分析 (转)
  5. 老婆回家时没有帮老婆打点,也完全忘记提醒老婆晚上火车上很凉,内疚.亲爱的,对不起!...
  6. 如何让路由器摆脱安全困扰
  7. 【BZOJ3598】【SCOI2014】方伯伯的商场之旅(数位dp)
  8. ECharts 3.0 初学感想及学习中遇到的瓶颈
  9. Qt 5 如何修改打包好的应用程序图标
  10. javascript中的'this'