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语句提供两个命名空间,一个是全局的一个是局部的,全局的必须是字典,局部的可以是任何形式的映射)
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语句提供两个命名空间,一个是全局的一个是局部的,全局的必须是字典,局部的可以是任何形式的映射)
相关文章推荐
- 记一次 Python 编码的坑
- python中FutureWarning问题解决方法
- 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
- 深度学习之-caffe预测、特征可视化python接口调用 (6)
- python基础---数据类型之间的转换
- 浅谈Python Web 安全开发
- python爬虫实战(一)----------爬取京东商品信息
- numpy.bincount详解
- Python知识总结帖
- python+opencv实现阈值分割
- Python数据分析示例(3)Day4
- 正则表达式,和python re模块
- python中lambda表达式的使用
- python的strip()内置函数,各种string内置函数见link
- python递归、迭代器和生成器在算法中的运用
- [Python笔记]第三篇:深浅拷贝、函数
- python字符串处理
- python "Non-ASCII character"错误
- Python 2 到 Python 3的变化
- Python面向对象编程基础