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
     
     
     
     
  • 相关阅读:
    0593. Valid Square (M)
    0832. Flipping an Image (E)
    1026. Maximum Difference Between Node and Ancestor (M)
    0563. Binary Tree Tilt (E)
    0445. Add Two Numbers II (M)
    1283. Find the Smallest Divisor Given a Threshold (M)
    C Primer Plus note9
    C Primer Plus note8
    C Primer Plus note7
    C Primer Plus note6
  • 原文地址:https://www.cnblogs.com/swefii/p/10850527.html
Copyright © 2011-2022 走看看