3 回答
TA贡献1840条经验 获得超5个赞
由于Python程序员通常不会说
将值None赋给变量是将其重置为其原始的空状态的一种方法。
很难以一种有意义的方式解释布里格斯的意思,并解释为什么这里没有人对此感到满意。一个类推可能会有所帮助:
在Python中,变量名称就像贴在对象上的标签一样。每个标签上都有一个唯一的名称,并且一次只能在一个对象上,但是如果需要,您可以在同一对象上放置多个标签。当你写
F = "fork"
您将标签“ F”放在字符串对象上"fork"。如果你再写
F = None
您将贴纸移动到None对象。
Briggs想让您想象的是,您没有写贴纸"F",而是已经在F贴纸上了None,您所做的就是将其从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,因为没有这样的标签。如果Briggs是正确的并且F = None重置F为其原始状态,那么它应该现在就在那,我们应该看到
>>> print(F)
None
就像我们在键入F = None并贴上贴纸后所做的那样None。
这就是所有的事情。实际上,Python附带了一些已经粘贴到对象上的标签(内置名称),但是其他一些标签则需要使用诸如F = "fork"and A = 2和这样的行来编写c17 = 3.14,然后再将它们粘贴到其他对象上(例如F = 10or F = None;它们都是一样的) )
Briggs假装您可能要写的所有可能的贴纸都已粘贴到该None对象上。
TA贡献1818条经验 获得超8个赞
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也是一个值,尽管该值通常用于表示空白。您正在阅读的书在这一点上具有误导性。
TA贡献1773条经验 获得超3个赞
这是Python文档必须说的None:
types.NoneType的唯一值。当没有将默认参数传递给函数时,通常不使用None来表示缺少值。
在版本2.4中更改:分配为None是非法的,并引发SyntaxError。
注意不能重新分配名称None和debug(分配给它们,即使作为属性名称也会引发SyntaxError),因此可以将它们视为“ true”常量。
让我们确认None第一个的类型
print type(None)
print None.__class__
输出量
<type 'NoneType'>
<type 'NoneType'>
基本上,NoneType数据类型类似于int,float等等。您可以在8.15中查看Python中可用的默认类型列表。types —内置类型的名称。
并且,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:)
添加回答
举报