您的位置:首页 > 编程语言 > Python开发

python中的pass,del,exec,eval语句

2016-05-08 21:03 363 查看
(1)pass语句

pass代表该语句什么都不做,因为python中空代码是非法的,比如一个if语句要求什么内容都不做,我们就可以使用pass语句。

(2)del语句

一般来说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是无法删除值。

(3)exec语句(运行字符串中的程序)

>>> 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语句提供两个命名空间,一个是全局的一个是局部的,全局的必须是字典,局部的可以是任何形式的映射)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: