您所指的这本书显然是在试图大大简化None
. Python 变量没有初始的空状态 - Python 变量(仅)在它们被定义时被绑定。你不能创建一个 Python 变量而不给它一个值。
>>> 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
但有时你想让一个函数意味着不同的东西,这取决于一个变量是否被定义。您可以创建一个默认值为 的参数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
周围给我们带来了两个好处:
- 我们不必选择
-1
含义不明确的特殊值,并且
- 我们的函数实际上可能需要
-1
作为普通输入来处理。
>>> 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