什么是无值?
我一直在学习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 = None把F重置到原来的状态,那么现在应该在那里,我们应该看到 
 >>> print(F) None 
 就像我们在inputF = None之后所做的那样,然后把贴纸贴在None 。 
 所以就是这样。 实际上,Python自带一些已经附加到对象(内置名称)的贴图,但是其他的你必须用F = "fork"和A = 2和c17 = 3.14这样的行来编写自己的代码,然后你可以将它们粘贴到其他对象(如F = 10或F = 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”常量。
- 
先确认 None的typesprint type(None) print None.__class__产量 <type 'NoneType'> <type 'NoneType'>
 基本上, NoneType和int , float等一样是一个数据types。你可以在8.15中查看Python中可用的默认types列表。  types – 内置types的名称 。 
- 
而且, None是NoneType类的一个实例。 所以我们可能要自己创buildNone实例。 我们来试试print types.IntType() print types.NoneType()产量 0 TypeError: cannot create 'NoneType' instances
 很显然,不能创buildNoneType实例。 我们不必担心值None的唯一性。 
- 
让我们来看看我们是如何在内部实现的。 print dir(None)产量 ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
 除了__setattr__ ,其他的都是只读属性。 所以,我们无法改变None的属性。 
- 
我们尝试将新属性添加到 Nonesetattr(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属性。 
- 
让我们来检查一下当我们分配一个 None时会发生什么 根据文档,它应该抛出一个SyntaxError。 这意味着,如果我们给None分配一些东西,程序根本就不会被执行。None = 1产量 SyntaxError: cannot assign to None
我们已经确定了
-   None是NoneType一个实例
-   None不能有新的属性
-   None现有属性无法更改。
-  我们不能创build其他的NoneType实例
-  我们甚至不能通过赋值来改变对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给我们两个好处: 
-  我们不需要select一个特殊的值,比如-1的含义是不清楚的
-  我们的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式是在定义函数时计算的,而不是在调用函数时计算的 。
因此, list1和list3在相同的默认列表上运行,而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