什么是无值?

我一直在研究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 = 2c17 = 3.14这样的行编写自己,然后你可以将它们粘贴到其他对象(如F = 10F = 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有undefinednull

请注意,在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'>
    
  • 基本上, NoneTypeintfloat等一样是一种数据类型。您可以在8.15中查看Python中可用的默认类型列表。 类型 - 内置类型的名称。

  • 而且, NoneNoneType类的一个实例。 所以我们可能想自己创建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
    
  • 我们已经确定

  • NoneNoneType一个实例
  • None不能拥有新的属性
  • None现有属性无法更改。
  • 我们不能创建其他的NoneType实例
  • 我们甚至无法通过为其分配值来更改对None的引用。
  • 因此,正如文件中所提到的, None真的可以被认为是一个true constant

    快乐的认识None :)

    链接地址: http://www.djcxy.com/p/76341.html

    上一篇: What is a None value?

    下一篇: Why does !{}[true] evaluate to true in JavaScript?