什么是无值?
我一直在研究Python,并且阅读了描述None
值的一章,但不幸的是,这本书在某些方面并不十分清晰。 我想我会找到我的问题的答案,如果我在那里分享。
我想知道“ None
值是什么以及你使用它的目的是什么?
而且,我没有得到这本书的这一部分:
分配的值None
给一个变量是将其重置到其原始的,空的状态的一种方法。
那是什么意思?
答案很棒,但由于我对计算机世界的知识水平低下(我还没有学过类,对象等),所以我并不了解大多数答案。 这句话是什么意思?
分配的值None
给一个变量是将其重置到其原始的,空的状态的一种方法。
最后:
最后,我从不同的答案中得到了答案。 我必须感谢所有帮助我的人(特别是Martijn Pieters和DSM),我希望我可以选择所有答案作为最好的选择,但是选择仅限于一个。 所有的答案都很棒。
Martijn的答案解释了Python中的None
,并正确地指出这本书有误导性。 由于Python程序员通常不会说
分配的值None
给一个变量是将其重置到其原始的,空的状态的一种方法。
很难解释布里格斯以一种合理的方式表达了什么意思,并解释了为什么这里没有人对此感到满意。 一个比喻可能有助于:
在Python中,变量名称就像贴在对象上的贴纸。 每个贴纸上都写有一个唯一的名字,并且它一次只能放在一个物体上,但如果你愿意的话,你可以在同一个物体上放置不止一个贴纸。 当你写
F = "fork"
你把标签“F”放在一个字符串对象"fork"
。 如果你然后写
F = None
您将标签移动到None
对象。
布里格斯要求你想象的是,你没有写 "F"
贴纸,“ None
上已经有一张F
标签,而你所做的只是把它None
到"fork"
。 所以当你输入F = None
时,如果我们决定把None
当作empty state
,你就会“重置它到原来的空状态”。
我可以看到他在看什么,但这是一个不好的方法来看待它。 如果你启动Python并输入print(F)
,你会发现
>>> print(F)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'F' is not defined
并且NameError
意味着Python不能识别名字F
, 因为没有这样的标签 。 如果布里格斯是对的, F = None
复位F
到原来的状态,那么它应该在那里了,我们应该看到
>>> print(F)
None
就像我们在输入F = None
之后做的那样,并将贴纸放在None
。
所以就是这样。 实际上,Python附带了一些已经附加到对象(内置名称)的贴图,但其他的你必须用F = "fork"
和A = 2
和c17 = 3.14
这样的行编写自己,然后你可以将它们粘贴到其他对象(如F = 10
或F = None
;它们都是一样的。)
布里格斯假装你可能想写的所有可能的贴纸都已经粘贴到了None
对象。
None
一个是通常用来表示'空'或'没有价值'的价值。 它是一个信号对象; 它只有意义,因为Python文档说明它有这个含义。
在给定的Python解释器会话中,该对象只有一个副本。
例如,如果您编写函数,并且该函数不使用显式return
语句,则返回None
。 这样,用函数进行编程非常简单; 一个函数总是返回一些东西,即使它只有一个None
对象。
你可以明确地测试它:
if foo is None:
# foo is set to None
if bar is not None:
# bar is set to something *other* than None
另一个用途是提供可选参数以实现'空'默认值的功能:
def spam(foo=None):
if foo is not None:
# foo was specified, do something clever!
函数spam()
有一个可选的参数; 如果您在未指定的情况下调用spam()
,则会为其指定默认值None
,以便轻松检测函数是否使用参数调用。
其他语言也有类似的概念。 SQL有NULL
; JavaScript有undefined
和null
等
请注意,在Python中,变量因使用而存在。 你不需要首先声明一个变量,所以在Python中没有真正的空变量。 将变量设置为None
与将其设置为默认空值不同; None
一个值也是值得的,尽管通常用来表示空白。 你正在阅读的书在这一点上是误导性的。
这就是Python文档要说的None
:
types.NoneType的唯一值。 没有经常用来表示没有值,因为默认参数没有传递给函数。
在版本2.4中更改:分配给None是非法的,并引发一个SyntaxError。
注意无名称和调试名称无法重新分配(即使作为属性名称,也会分配给它们,引发SyntaxError),因此可以将它们视为“true”常量。
让我们先确认None
的类型
print type(None)
print None.__class__
产量
<type 'NoneType'>
<type 'NoneType'>
基本上, NoneType
与int
, float
等一样是一种数据类型。您可以在8.15中查看Python中可用的默认类型列表。 类型 - 内置类型的名称。
而且, None
是NoneType
类的一个实例。 所以我们可能想自己创建None
实例。 让我们试试
print types.IntType()
print types.NoneType()
产量
0
TypeError: cannot create 'NoneType' instances
很显然,不能创建NoneType
实例。 我们不必担心值None
的唯一性。
让我们来看看我们如何在内部实现None
。
print dir(None)
产量
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
除了__setattr__
,其他所有属性都是只读属性。 所以,我们无法改变None
的属性。
我们尝试将新属性添加到None
setattr(types.NoneType, 'somefield', 'somevalue')
setattr(None, 'somefield', 'somevalue')
None.somefield = 'somevalue'
产量
TypeError: can't set attributes of built-in/extension type 'NoneType'
AttributeError: 'NoneType' object has no attribute 'somefield'
AttributeError: 'NoneType' object has no attribute 'somefield'
以上看到的语句分别产生这些错误消息。 这意味着我们不能在None
实例上动态地创建属性。
让我们检查一下当我们分配什么None
时会发生什么。 根据文档,它应该抛出一个SyntaxError
。 这意味着,如果我们将某些内容分配给None
,程序根本不会执行。
None = 1
产量
SyntaxError: cannot assign to None
我们已经确定
None
是NoneType
一个实例 None
不能拥有新的属性 None
现有属性无法更改。 NoneType
实例 None
的引用。 因此,正如文件中所提到的, None
真的可以被认为是一个true constant
。
快乐的认识None
:)