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

下面介绍一下python中会用到的pass,del,exec,eval四个语句。可以理解的不是很好python中的pass,del,exec,eval语句(原创),见解不到之处还请多多包含。
 (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语句提供两个命名空间,一个是全局的一个是局部的,全局的必须是字典,局部的可以是任何形式的映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值