本章最后我们介绍另外三条语句:pass,del,exec
什么都不做,没错pass就是什么都不做。这种情况不多,但一旦遇到,知道可使用pass语句大有裨益。
>>> pass
>>>
这里什么都没发生。
那为何需要一条什么都不做的语句呢?在你编写代码时,可将其用作占位符。例如,你可能编写了一条if语句并想尝试运行它,但是缺少一个代码块,如下所示
while(True):
x=int(input())
if x > 0:
print("正数")
else:
这些代码不能运行,因为在python中代码块不能为空。要修复这个问题,只需在中间的代码块中添加一句pass语句即可,
while(True):
x=int(input())
if x > 0:
print("正数")
else:
pass
对于你不再使用的对象,python通常会将其删除(因为没有任何变量或数据结构成员指向它)。
s=[0,1,2,3]
y=s
print(s)
print(y)
s=None
print(y)
y=None
最初s和y都是指向同一个列表,因此将None给了s后,依然可以通过y来访问列表,但y也设置为None之后,这个字典就漂浮在内存中,没有任何名称与之相关联,再也无法获取或使用它了。因此,智慧无穷的python解释器就直接将其删除。这被称为垃圾收集。请注意,在前面的代码中,也可将其他任何值赋给俩个变量,这样字典也将消失。
另一种办法是使用del语句。这不仅会删除对象的引用,还会删除名称本身
>>> x=1
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
这个看似简单,但有时候不太好理解。例如下列代码
>>> x=[1,2]
>>> y=x
>>> y.append(3)
>>> x
[1, 2, 3]
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> y
[1, 2, 3]
你可能认为通过删除x,也将删除y,但情况并非如此
这是因为你只删除名称x而没有删除列表本身的值,事实上在python中,根本就没有办法删除值,而且你也不需要那样做,对于你不再使用的值,python解释器会立即删除。
有时候,你可能想动态地编写python代码,并将其作为语句执行或作为表达式进行计算。这可能犹如黑魔法,一定要小心。exec和eval现在都是函数,在项目中请慎用
函数exec将字符串作为代码执行。
>>> exec('print("hello")')
hello
然而,调用函数exec时只给它提供一个参数绝非好事。在大多数情况下,还应该向它传递一个命名空间-用于放置变量的地方;否则代码将污染你的命名空间,即修改你吃的变量、例如下列代码
>>> from math import sqrt
>>> exec('sqrt =1')
>>> sqrt(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>>
既然如此,为何要将字符串作为代码执行呢? 函数exec主要用于动态地创建代码字符串。如果这种字符串来自其他地方,就无法确定它将包含什么内容。因此为了安全起见,要提供一个字典以命名空间。
命名空间(作用域)是个重要的概念,将在下一章深入讨论,但就目前而言,你可将命名空间视为放置变量的地方,类似一个看不见的字典。因此,当你执行语句sqrt=1时,将在当前命名空间存储键和值1.当前命名空间通常是全局命名空间。
为此,你添加第二个参数-字典,用作代码字符串的命名空间。
>>> from math import sqrt
>>> scope={}
>>> exec('sqrt =1',scope)
>>> sqrt(4)
2.0
>>> scope['sqrt']
1
如你所见,没有破坏sqrt函数,而通过exec执行赋值语句创建的变量在scope中。
eval是一个类似exec的内置函数。exec执行一些列python语句,而eval计算字符串表示的python表达式,并返回结果(exec什么都不返回)
>>> eval('+'.join(list(input('输出各位相加和:'))))
输出各位相加和:1234
10
eval也可使用命名空间 例如:
>>> scope={}
>>> scope['y']=2
>>> scope['x']=2
>>> eval('x*y',scope)
4