什么是无值?
我一直在学习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
的属性。
-
我们尝试将新属性添加到
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属性。
-
让我们来检查一下当我们分配一个
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