下面介绍一下python中会用到的pass,del,exec,eval四个语句。可以理解的不是很好,见解不到之处还请多多包含。
(1)pass语句
pass代表该语句什么都不做,因为python中空代码是非法的,比如一个if语句要求什么内容都不做,我们就可以使用pass语句。
一般来说python会删除那些不在使用的对象(因为使用者不会再通过任何变量或者数据结构引用它们)
接下来我们看一个例子:
>>> ls = {'a':1,'b':2,'c':3}
>>> y = ls
>>> y
{'a': 1, 'c': 3, 'b': 2}
>>> y = None
>>> y
>>> ls
{'a': 1, 'c': 3, 'b': 2}
>>> ls = None
>>> ls
首先y和ls两个对象被绑定在同一个字典上,所以当y被设置成None时,字典通过ls依然可以使用,但是当我们把ls也设置成为none时,字典就"漂"在内存里了,没有任何名字绑定在它上面,没有办法去获取到它,所以python会去直接删除它(这种行为成为垃圾收集),另一个方法就是del方法,它不仅可以移除一个对象的引用,还可以删除那个名字本身。
再看一个例子:
>>> x = 1
>>> y = x
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> y
1
x和y都指向同一个列表,但是删除x并不会影响y。原因就是因为删除的只是名称,而并不是列表本身(即值)。事实上python是无法删除值。
>>> exec "print 'hello world'"
hello world
但是有时会存在一个问题,很多情况下可以给它提供一个命名空间--可以放置变量的地方,这样会干扰你的命名空间(放置变量的地方),比如会出现这样的情况。
>>> from math import sqrt
>>> sqrt(4)
2.0
>>> exec 'sqrt = 1'
>>> sqrt(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
exec最有用的地方在于可以动态的创建代码字符串。如果字符串是从其他地方获得--可能是从用户那里获得,那么几乎不能确定其中包含什么代码。所以为了安全起见,可以增加一个字典,起到命名空间的作用。
可以通过in <scope>来实现,其中<scope>就是放置代码字符串的命名空间作用的字典。
>>> from math import sqrt
>>> tt = {}
>>> exec 'sqrt = 1' in tt
>>> sqrt(4)
2.0
上述的命名空间几乎都是全局命名空间。从上的例子中我们可以看出,潜在的破坏性代码并不会覆盖sqrt函数,原来的函数可以正常运作,而通过exec赋值的变量sqrt只在它的作用域内有效。注意:如果要将tt打出来的话,会看到很多东西,因为内建函数__builtins__字典自动包含所有的内建函数和值。
>>> tt.keys()
['__builtins__', 'sqrt']
>>> tt['sqrt']
1
(4)eval函数(会计算python表达式(以字符串形式书写),并且返回结果)
>>> eval_r('2+ 2')
4
>>> exec '2 + 2'
>>> eval_r(raw_input("please input number"))
please input number2*3-1
5
eval也可以使用命名空间,尽管表达式几乎不像语句那样为变量重新赋值,事实上,可以给eval语句提供两个命名空间,一个是全局的一个是局部的,全局的必须是字典,局部的可以是任何形式的映射
(2)del语句
(3)exec语句(运行字符串中的程序)