什么是无值?

我一直在学习Python,并且阅读了描述None值的一章,但不幸的是,这本书在某些方面还不是很清楚。 我想如果我在那里分享,我会find我的问题的答案。

我想知道什么是None ,你用它做什么?

而且,我也没有得到这本书的这一部分:

将一个值赋值给variables是将其重置为原始空状态的一种方法。

那是什么意思?

答案很棒,但是由于对计算机世界的了解不多(我还没有学过类,对象等等),所以我不能理解大部分的答案。 这句话是什么意思?

将一个值赋值给variables是将其重置为原始空状态的一种方法。

最后:

最后,我从不同的答案中得到了答案。 我必须感谢那些把时间用来帮助我的人们(特别是Martijn Pieters和DSM),我希望我可以select所有的答案作为最好的答案,但select只限于一个。 所有的答案都很好。

Martijn的答案解释了Python中的“ None ,并正确地指出这本书是误导性的。 由于Python程序员通常不会说

将一个值赋值给variables是将其重置为原始空状态的一种方法。

很难解释布里格斯以一种合理的方式expression了什么,并解释了为什么这里没有人对此感到满意。 一个比喻可能有助于:

在Python中,variables名称就像贴在对象上的贴纸。 每个贴纸上都有一个独特的名字,一次只能放在一个物体上,但是如果你愿意的话,你可以在同一个物体上贴上多个贴纸。 当你写

 F = "fork" 

你把标签“F”放在一个string对象"fork" 。 如果你然后写

 F = None 

您将标签移动到None对象。

布里格斯要求你设想的是,你没有 "F"标签,“ None已经有一个F标签了,你所做的只是None "fork" 。 所以当你键入F = None时,如果我们决定将None作为empty state ,那么你将它重置为原来的empty state

我可以看到他在做什么,但这是一个不好的方法来看待它。 如果你启动Python并inputprint(F) ,你会看到

 >>> print(F) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'F' is not defined 

NameError意味着Python不能识别F这个名字, 因为没有这个标签 。 如果布里格斯是正确的,而F = NoneF重置到原来的状态,那么现在应该在那里,我们应该看到

 >>> print(F) None 

就像我们在inputF = None之后所做的那样,然后把贴纸贴在None


所以就是这样。 实际上,Python自带一些已经附加到对象(内置名称)的贴图,但是其他的你必须用F = "fork"A = 2c17 = 3.14这样的行来编写自己的代码,然后你可以将它们粘贴到其他对象(如F = 10F = None ;都是一样的)。

布里格斯假装,你可能想写的所有可能的贴纸已经坚持None对象。

None一个是通常用来表示“空”或“没有价值”的价值。 这是一个信号对象 ; 它只有意义,因为Python文档说它有这个意思。

在给定的Python解释器会话中,只有该对象的一个​​副本。

如果你写了一个函数,而且这个函数没有使用显式的return语句,那么就返回None 。 这样,用函数进行编程就简单得多了。 一个函数总是返回一些东西 ,即使它只有一个None对象。

你可以明确地testing它:

 if foo is None: # foo is set to None if bar is not None: # bar is set to something *other* than None 

另一个用途是提供可选的参数来实现“空”缺省值的function:

 def spam(foo=None): if foo is not None: # foo was specified, do something clever! 

函数spam()有一个可选的参数; 如果您在未指定的情况下调用spam() ,则默认值为None ,从而可以轻松检测到该函数是否使用参数调用。

其他语言也有类似的概念。 SQL有NULL ; JavaScript有undefined null

请注意,在Python中,由于被使用而存在variables。 你不需要首先声明一个variables,所以Python中没有真正的variables。 将variables设置为None与将其设置为默认空值不同, None什么价值,虽然常常用来表示空虚。 你正在阅读的书在这一点上是误导性的。

这就是Python文档要说的None

types.NoneType的唯一值。 没有经常用来表示没有值,因为当默认参数不传递给一个函数。

在版本2.4中更改:分配给无是非法的,并引发一个SyntaxError。

注意无名称和debugging名称不能重新分配(即使作为属性名称赋值给SyntaxError),因此可以将它们视为“true”常量。

  1. 先确认None的types

     print type(None) print None.__class__ 

    产量

     <type 'NoneType'> <type 'NoneType'> 

基本上, NoneTypeintfloat等一样是一个数据types。你可以在8.15中查看Python中可用的默认types列表 types – 内置types的名称

  1. 而且, NoneNoneType类的一个实例。 所以我们可能要自己创buildNone实例。 我们来试试

     print types.IntType() print types.NoneType() 

    产量

     0 TypeError: cannot create 'NoneType' instances 

很显然,不能创buildNoneType实例。 我们不必担心值None的唯一性。

  1. 让我们来看看我们是如何在内部实现的。

     print dir(None) 

    产量

     ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

除了__setattr__ ,其他的都是只读属性。 所以,我们无法改变None的属性。

  1. 我们尝试将新属性添加到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实例上dynamic地创build属性。

  1. 让我们来检查一下当我们分配一个None时会发生什么 根据文档,它应该抛出一个SyntaxError 。 这意味着,如果我们给None分配一些东西,程序根本就不会被执行。

     None = 1 

    产量

     SyntaxError: cannot assign to None 

我们已经确定了

  1. NoneNoneType一个实例
  2. None不能有新的属性
  3. None现有属性无法更改。
  4. 我们不能创build其他的NoneType实例
  5. 我们甚至不能通过赋值来改变对None的引用。

所以,正如文件中所提到的, None能真正被认为是一个true constant

快乐的认识None 🙂

你提到的这本书显然是在极大地简化“ None的含义。 Pythonvariables没有初始的空状态 – 当Pythonvariables被定义时,它们被绑定(仅) 。 你不能创build一个Pythonvariables而不给它一个值。

 >>> print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> def test(x): ... print(x) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: test() takes exactly 1 argument (0 given) >>> def test(): ... print(x) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test NameError: global name 'x' is not defined 

但是有时你想根据variables是否被定义来做一个函数意味着不同的事情。 您可以创build一个默认值为None的参数:

 >>> def test(x=None): ... if x is None: ... print('no x here') ... else: ... print(x) ... >>> test() no x here >>> test('x!') x! 

这个值是特殊的None值在这种情况下不是非常重要的事实。 我可以使用任何默认值:

 >>> def test(x=-1): ... if x == -1: ... print('no x here') ... else: ... print(x) ... >>> test() no x here >>> test('x!') x! 

…但None周围None给我们两个好处:

  1. 我们不需要select一个特殊的值,比如-1的含义是不清楚的
  2. 我们的function实际上可能需要处理-1作为一个正常的input。
 >>> test(-1) no x here 

哎呀!

所以这本书在使用单词reset方面有一点误导性 – 把None分配给名字是给程序员的一个信号,表明这个值没有被使用,或者函数应该以某种默认的方式运行,值的原来的,未定义的状态,你必须使用del关键字:

 >>> x = 3 >>> x 3 >>> del x >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined 

我喜欢代码示例(以及水果),所以让我给你看看

 apple = "apple" print(apple) >>> apple apple = None print(apple) >>> None 

没有任何意义,没有价值。

没有评估为假。

没有一个是单一的对象(意思是只有一个无),在语言和图书馆的许多地方用来表示没有其他价值。

例如:
如果d是字典,则d.get(k)将返回d[k] ,如果d不存在,则返回None

从一个伟大的博客阅读这个信息: http : //python-history.blogspot.in/

其他答案已经很好地解释了“ 无”的含义。 不过,我仍然想用一个例子来更多地指出这一点。

例:

 def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 

现在尝试猜测上面列表的输出。 那么, 答案是惊人的如下:

 list1 = [10, 'a'] list2 = [123] list3 = [10, 'a'] 

但为什么?

许多人会错误地认为list1等于[10]list3等于['a'] ,认为每次调用extendList时,list参数都会被设置为默认值[]

然而,实际发生的情况是, 当函数被定义时新的默认列表仅被创build一次 ,并且随后在每次调用extendList而没有指定列表参数时使用相同的列表。 这是因为默认参数中的expression式是在定义函数时计算的,而不是在调用函数时计算的

因此, list1list3在相同的默认列表上运行,而list2在它创build的单独列表上运行(通过传递自己的空列表作为list参数的值)。


“没有”救世主:(修改上面的例子来产生所需的行为)

 def extendList(val, list=None): if list is None: list = [] list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 

通过这一修订的实施,产出将是:

 list1 = [10] list2 = [123] list3 = ['a'] 

– toptal.com信用示例

 largest=none smallest =none While True : num =raw_input ('enter a number ') if num =="done ": break try : inp =int (inp) except: Print'Invalid input' if largest is none : largest=inp elif inp>largest: largest =none print 'maximum', largest if smallest is none: smallest =none elif inp<smallest : smallest =inp print 'minimum', smallest print 'maximum, minimum, largest, smallest