Python 中的空对象
如何在 Python 中引用 null 对象?
How do I refer to the null object in Python?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何在 Python 中引用 null 对象?
How do I refer to the null object in Python?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(10)
在 Python 中,“null”对象是单例
None
。要检查某些内容是否为
None
,请使用是
身份运算符:In Python, the 'null' object is the singleton
None
.To check if something is
None
, use theis
identity operator:None
,Python 的 null?Python 中没有
null
;相反,有无
。如前所述,测试某项是否已被赋予None
作为值的最准确方法是使用is
恒等运算符,该运算符测试两个变量是否引用相同的变量目的。基础知识
存在且只能有一个
None
None
是类NoneType
的唯一实例,任何进一步尝试实例化该类都将返回同一个对象,这使得None
成为单例。 Python 新手经常会看到提到NoneType
的错误消息,并且想知道它是什么。我个人认为,这些消息可以简单地提及None
的名称,因为我们很快就会看到,None
几乎没有留下任何歧义的空间。因此,如果您看到一些TypeError
消息提到NoneType
不能执行此操作或不能执行该操作,只需知道它只是一个None 正在以一种它不能的方式使用。
此外,
None
是一个内置常量。一旦您启动 Python,就可以在任何地方使用它,无论是在模块、类还是函数中。相比之下,NoneType
则不然,您需要首先通过查询None
的类来获取对它的引用。您可以使用 Python 的身份函数
id()
检查None
的唯一性。它返回分配给对象的唯一编号,每个对象都有一个。如果两个变量的id相同,那么它们实际上指向同一个对象。None
无法被覆盖在更旧的 Python 版本(2.4 之前)中,可以重新分配
None
,但现在不能了。即使作为类属性或在函数范围内也不行。因此,可以安全地假设所有
None
引用都是相同的。没有任何“自定义”None
。要测试
None
,请使用is
运算符在编写代码时,您可能会想像这样测试 Noneness:
或者像这样测试 false
您需要了解其中的含义以及为什么明确表达通常是一个好主意。
案例 1:测试某个值是否为
None
为什么要这样做
而不是
?
第一个相当于:
而表达式
value==None
实际上是这样应用的如果值确实是
None
那么您将得到您所期望的结果。在大多数常见情况下,结果是相同的,但 __eq__() 方法打开了一扇无法保证准确性的大门,因为它可以在类中被重写以提供特殊行为。
考虑一下这个类。
因此,您在
None
上尝试,它可以工作但是它也可以在空字符串上工作
但是
案例 2:使用
None
作为布尔值以下两个测试
实际上评估了 因为
None
是一个“falsey”,这意味着如果转换为布尔值,它将返回False
,如果应用not
运算符,它将返回 <代码>真。但请注意,它不是None
独有的属性。除了 False 本身之外,该属性还由空列表、元组、集合、字典、字符串以及 0 以及实现 __bool__() 的类中的所有对象共享。 code> 返回False
的魔术方法。因此,当按以下方式测试变量时,请额外注意您在测试中包含或排除的内容:
在上面,您是否打算在专门设置值时调用
init_value()
到None
,或者您的意思是设置为0
的值、空字符串或空列表也应该触发初始化?就像我说的,要留心。通常情况下,在 Python 中显式优于隐式。None
实践中None
用作信号值None
在 Python 中具有特殊地位。它是最受欢迎的基线值,因为许多算法将其视为特殊值。在这种情况下,它可以用作标志来表明某个条件需要一些特殊处理(例如设置默认值)。您可以将
None
分配给函数的关键字参数,然后显式测试它。当尝试获取对象的属性时,您可以将其作为默认值返回,然后在执行特殊操作之前显式测试它。
默认情况下,字典的
get()
方法在尝试访问不存在的键时返回None
:如果您尝试使用下标表示法来访问它,则会返回
则会引发>KeyError
同样,如果您尝试弹出一个不存在的项目
的默认值来抑制该项目,
,您可以使用通常设置为
None
None
作为标志和有效值上述使用
None
的情况适用于它不被视为有效值的情况,但更像是执行某些特殊操作的信号。然而,在某些情况下,了解None
来自何处有时很重要,因为即使它被用作信号,它也可能是数据的一部分。当您使用
getattr(some_obj, 'attribute_name', None)
查询对象的属性时,返回None
不会告诉您您尝试访问的属性是否是设置为None
或者如果它完全不存在于对象中。从字典中访问键时的情况相同,例如some_dict.get('some_key')
,您不知道some_dict['some_key']
是否丢失或如果它只是设置为None
。如果您需要该信息,处理此问题的常用方法是直接尝试从try/ except
构造中访问属性或键:与 dict 类似:
上面的两个示例显示了如何处理 object 和字典案例。功能呢?同样的事情,但我们使用双星号关键字参数来达到此目的:
None
仅用作有效值如果您发现您的代码中充斥着上述
try/ except
模式只是为了区分None
标志和None
数据,然后只需使用另一个测试值。有一种模式,其中超出有效值集的值作为数据的一部分插入数据结构中,并用于控制和测试特殊条件(例如边界、状态等)。这样的值称为哨兵,它可以像None
用作信号一样使用。在 Python 中创建哨兵很简单。上面的
undefined
对象是唯一的,并且不会做任何程序可能感兴趣的事情,因此它是None
作为标志的绝佳替代品。需要注意一些注意事项,更多关于代码后面的内容。使用函数
使用 dict
使用对象
正如我之前提到的,自定义哨兵有一些注意事项。首先,它们不是像
None
这样的关键字,因此 Python 不保护它们。您可以随时在定义的模块中的任何位置覆盖上面的undefined
,因此要小心如何公开和使用它们。接下来,object()
返回的实例不是单例。如果您调用 10 次,您将获得 10 个不同的对象。最后,哨兵的使用非常特殊。哨兵是特定于它所使用的库的,因此它的范围通常应限于库的内部。它不应该“泄漏”出去。只有当外部代码的目的是扩展或补充库的 API 时,它们才应该意识到这一点。None
, Python's null?There's no
null
in Python; instead there'sNone
. As stated already, the most accurate way to test that something has been givenNone
as a value is to use theis
identity operator, which tests that two variables refer to the same object.The basics
There is and can only be one
None
None
is the sole instance of the classNoneType
and any further attempts at instantiating that class will return the same object, which makesNone
a singleton. Newcomers to Python often see error messages that mentionNoneType
and wonder what it is. It's my personal opinion that these messages could simply just mentionNone
by name because, as we'll see shortly,None
leaves little room to ambiguity. So if you see someTypeError
message that mentions thatNoneType
can't do this or can't do that, just know that it's simply the oneNone
that was being used in a way that it can't.Also,
None
is a built-in constant. As soon as you start Python, it's available to use from everywhere, whether in module, class, or function.NoneType
by contrast is not, you'd need to get a reference to it first by queryingNone
for its class.You can check
None
's uniqueness with Python's identity functionid()
. It returns the unique number assigned to an object, each object has one. If the id of two variables is the same, then they point in fact to the same object.None
cannot be overwrittenIn much older versions of Python (before 2.4) it was possible to reassign
None
, but not any more. Not even as a class attribute or in the confines of a function.It's therefore safe to assume that all
None
references are the same. There isn't any "custom"None
.To test for
None
use theis
operatorWhen writing code you might be tempted to test for Noneness like this:
Or to test for falsehood like this
You need to understand the implications and why it's often a good idea to be explicit.
Case 1: testing if a value is
None
Why do
rather than
?
The first is equivalent to:
Whereas the expression
value==None
is in fact applied like thisIf the value really is
None
then you'll get what you expected.In most common cases the outcome will be the same, but the
__eq__()
method opens a door that voids any guarantee of accuracy, since it can be overridden in a class to provide special behavior.Consider this class.
So you try it on
None
and it worksBut then it also works on the empty string
And yet
Case 2: Using
None
as a booleanThe following two tests
are in fact evaluated as
None
is a "falsey", meaning that if cast to a boolean it will returnFalse
and if applied thenot
operator it will returnTrue
. Note however that it's not a property unique toNone
. In addition toFalse
itself, the property is shared by empty lists, tuples, sets, dicts, strings, as well as 0, and all objects from classes that implement the__bool__()
magic method to returnFalse
.So when testing for variables in the following way, be extra aware of what you're including or excluding from the test:
In the above, did you mean to call
init_value()
when the value is set specifically toNone
, or did you mean that a value set to0
, or the empty string, or an empty list should also trigger the initialization? Like I said, be mindful. As it's often the case, in Python explicit is better than implicit.None
in practiceNone
used as a signal valueNone
has a special status in Python. It's a favorite baseline value because many algorithms treat it as an exceptional value. In such scenarios it can be used as a flag to signal that a condition requires some special handling (such as the setting of a default value).You can assign
None
to the keyword arguments of a function and then explicitly test for it.You can return it as the default when trying to get to an object's attribute and then explicitly test for it before doing something special.
By default a dictionary's
get()
method returnsNone
when trying to access a non-existing key:If you were to try to access it by using the subscript notation a
KeyError
would be raisedLikewise if you attempt to pop a non-existing item
which you can suppress with a default value that is usually set to
None
None
used as both a flag and valid valueThe above described uses of
None
apply when it is not considered a valid value, but more like a signal to do something special. There are situations however where it sometimes matters to know whereNone
came from because even though it's used as a signal it could also be part of the data.When you query an object for its attribute with
getattr(some_obj, 'attribute_name', None)
getting backNone
doesn't tell you if the attribute you were trying to access was set toNone
or if it was altogether absent from the object. The same situation when accessing a key from a dictionary, likesome_dict.get('some_key')
, you don't know ifsome_dict['some_key']
is missing or if it's just set toNone
. If you need that information, the usual way to handle this is to directly attempt accessing the attribute or key from within atry/except
construct:Similarly with dict:
The above two examples show how to handle object and dictionary cases. What about functions? The same thing, but we use the double asterisks keyword argument to that end:
None
used only as a valid valueIf you find that your code is littered with the above
try/except
pattern simply to differentiate betweenNone
flags andNone
data, then just use another test value. There's a pattern where a value that falls outside the set of valid values is inserted as part of the data in a data structure and is used to control and test special conditions (e.g. boundaries, state, etc.). Such a value is called a sentinel and it can be used the wayNone
is used as a signal. It's trivial to create a sentinel in Python.The
undefined
object above is unique and doesn't do much of anything that might be of interest to a program, it's thus an excellent replacement forNone
as a flag. Some caveats apply, more about that after the code.With function
With dict
With an object
As I mentioned earlier, custom sentinels come with some caveats. First, they're not keywords like
None
, so Python doesn't protect them. You can overwrite yourundefined
above at any time, anywhere in the module it's defined, so be careful how you expose and use them. Next, the instance returned byobject()
is not a singleton. If you make that call 10 times you get 10 different objects. Finally, usage of a sentinel is highly idiosyncratic. A sentinel is specific to the library it's used in and as such its scope should generally be limited to the library's internals. It shouldn't "leak" out. External code should only become aware of it, if their purpose is to extend or supplement the library's API.它不像其他语言那样被称为 null,而是
None
。该对象始终只有一个实例,因此如果需要,您可以使用x is None
(身份比较)而不是x == None
检查等效性。It's not called null as in other languages, but
None
. There is always only one instance of this object, so you can check for equivalence withx is None
(identity comparison) instead ofx == None
, if you want.在 Python 中,要表示不存在值,可以对对象使用 None 值 (types.NoneType.None),并使用 "" (或 len() == 0)对于字符串。因此:
关于“==”和“is”之间的区别,使用“==”测试对象身份应该足够了。然而,由于操作“is”被定义为对象标识操作,因此使用它可能比“==”更正确。不确定是否存在速度差异。
无论如何,你可以看看:
In Python, to represent the absence of a value, you can use the None value (types.NoneType.None) for objects and "" (or len() == 0) for strings. Therefore:
Regarding the difference between "==" and "is", testing for object identity using "==" should be sufficient. However, since the operation "is" is defined as the object identity operation, it is probably more correct to use it, rather than "==". Not sure if there is even a speed difference.
Anyway, you can have a look at:
上面的答案只会在
None
的情况下得出True
,但有float('nan')
之类的东西。你可以使用pandasisnull
:或者不使用
pandas
:它起作用的原因是
float('nan') != float('nan')
:The above answers only will result
True
forNone
, but there is such a thing asfloat('nan')
. You could use pandasisnull
:Or without
pandas
:The reason this works is because
float('nan') != float('nan')
:使用
f
字符串来解决这个问题。Use
f
string for getting this solved.Python 中处理“空”元素的简单函数:
代码:
测试:
输出:
Simple function to tackle "empty" element in Python:
Code:
Test:
Output:
想象一下,如果查询为变量测试返回空值
Imagine if the query is returning null value for variable test
根据 真值测试,“None”直接测试为 FALSE,因此最简单的表达式就足够了:
Per Truth value testing, 'None' directly tests as FALSE, so the simplest expression will suffice:
Null 是一种特殊的对象类型,例如:
您可以检查对象是否在“NoneType”类中:
更多信息可在 Python 文档
Null is a special object type like:
You can check if an object is in class 'NoneType':
More information is available at Python Docs