zoukankan      html  css  js  c++  java
  • Python-13-pass,del和exec

    1.pass就是什么都不做
    >>> pass
    >>>
     
    2. 对于你不再使用的对象, Python通常会将其删除(因为没有任何变量或数据结构成员指向它) 。
    >>> scoundrel = {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'}
    >>> robin = scoundrel
    >>> scoundrel
    {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'}
    >>> robin
    {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'}
    >>> scoundrel = None
    >>> robin
    {'age': 42, 'first name': 'Robin', 'last name': 'of Locksley'}
    >>> robin = None
    最初, robin和scoundrel指向同一个字典,因此将None赋给scoundrel后,依然可以通过robin
    来访问这个字典。但将robin也设置为None之后,这个字典就漂浮在计算机内存中,没有任何名
    称与之相关联,再也无法获取或使用它了。因此,智慧无穷的Python解释器直接将其删除。这被
    称为垃圾收集。请注意,在前面的代码中,也可将其他任何值(而不是None)赋给两个变量,这
    样字典也将消失。
    另一种办法是使用del语句。(第2章和第4章使用这条语句来删除序列和字典,还记得吗?)
    这不仅会删除到对象的引用,还会删除名称本身。
    >>> x = 1
    >>> del x
    >>> x
    Traceback (most recent call last):
    File "<pyshell#255>", line 1, in ?
    x
    NameError: name 'x' is not defined
    这看似简单,但有时不太好理解。例如,在下面的示例中, x和y指向同一个列表:
    >>> x = ["Hello", "world"]
    >>> y = x
    >>> y[1] = "Python"
    >>> x
    ['Hello', 'Python']
    你可能认为通过删除x,也将删除y,但情况并非如此。
    >>> del x
    >>> y
    ['Hello', 'Python']
    这是为什么呢? x和y指向同一个列表,但删除x对y没有任何影响,因为你只删除名称x,而
    没有删除列表本身(值)。事实上,在Python中,根本就没有办法删除值,而且你也不需要这样
    做,因为对于你不再使用的值, Python解释器会立即将其删除。
     
    3.这里执行存储在字符串中的Python代码, 这样做可能带来严重的安全隐患。如
    果将部分内容由用户提供的字符串作为代码执行 ,将无法控制代码的行为。
    函数exec将字符串作为代码执行。
    >>> exec("print('Hello, world!')")
    Hello, world!
    命名空间(作用域)( 当你执行赋值语句x = 1时,将在当前命名空间存储键x和值1)
    使用这个时为了防止来自别的地方的代码污染程序本身的命名空间,可以再添加第二个参数---字典,用作代码的命名空间
    >>> from math import sqrt
    >>> scope = {}
    >>> exec('sqrt = 1', scope)
    >>> sqrt(4)
    2.0
    >>> scope['sqrt']
    1
    函数eval会返回字符串中表达式的值
    >>> eval(input("Enter an arithmetic expression: "))
    Enter an arithmetic expression: 6 + 18 * 2
    42
    与exec一样,也可向eval提供一个命名空间,虽然表达式通常不会像语句那样给变量重新赋值。
    向exec或eval提供命名空间时,可在使用这个命名空间前在其中添加一些值。
    >>> scope = {}
    >>> scope['x'] = 2
    >>> scope['y'] = 3
    >>> eval('x * y', scope)
    6
     
     
     
     
  • 相关阅读:
    .net core 获取程序中文件路径
    关于autofac的一些具体的用法
    Ztree节点增加删除修改和Icheck的用法
    C# 多线程之Task(任务
    C#开启异步 线程的四种方式
    c# thread数线程的创建
    图片转二进制 ,
    循环中如果有某一次循环抛出异常了整个循环就停止的解决办法
    JAVA 8 Optional的使用
    react 获取指定表单对象中的对象的值
  • 原文地址:https://www.cnblogs.com/swefii/p/10850527.html
Copyright © 2011-2022 走看看