为了账号安全,请及时绑定邮箱和手机立即绑定

什么是无值?

什么是无值?

慕码人8056858 2019-10-16 14:03:01
我一直在研究Python,并且阅读了描述其None价值的一章,但不幸的是,这本书在某些方面并不十分清楚。我以为,如果我在那分享我的问题,我会找到答案。我想知道None价值是什么,您将其用于什么?而且,我没有得到本书的这一部分:将值None赋给变量是将其重置为其原始的空状态的一种方法。这意味着什么?答案很棒,尽管由于我对计算机世界的了解不足(我还没有了解类,对象等),所以我对大多数答案都不了解。这句话是什么意思?将值None赋给变量是将其重置为其原始的空状态的一种方法。最后:最后,我从寻找不同的答案中得到了答案。我必须感谢所有抽出宝贵时间来帮助我的人(尤其是Martijn Pieters和DSM),我希望我可以选择所有答案作为最佳答案,但是选择仅限于一个。所有的答案都很好。
查看完整描述

3 回答

?
慕斯709654

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对象上。


查看完整回答
反对 回复 2019-10-16
?
弑天下

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也是一个值,尽管该值通常用于表示空白。您正在阅读的书在这一点上具有误导性。


查看完整回答
反对 回复 2019-10-16
?
慕容3067478

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:)


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 644 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信