python中if for 作用域问题

时间:2022-06-05 06:07:58

先看一段代码

class Car():
    def __init__(self,name):
        self.name = name
    def __repr__(self):
        return self.name

if __name__ == '__main__':
    import weakref
    cars = {Car('bj'),Car('bm'),Car('dz')}    (1)
    weak = weakref.WeakValueDictionary()
    for i in cars:                            (2)
        weak[i.name] = i

    print(list(weak.keys()))

    del cars                                  (3)

    print(list(weak.keys()))

代码的输出

['bj', 'bm', 'dz']
['dz']

(1)创建了一个Car对象的集合
(2)将Car对象的name属性作为键,Car对象作为值,创建了一个映射,这个映射的值是弱引用
(3)删除cars引用

正常来讲删除掉一个对象的所有引用(不包括弱引用)后,这个对象将会被销毁,然而在这里我们通过弱引用发现 ‘dz’ 这个对象并没有被销毁,这是因为 for 循环中那个 i 是全局变量,他仍然保持这对 ‘dz’ 这个对象的一个引用,因此 ‘dz’ 并没有被销毁。

再看一段代码

def func():
    if True:
        a = 12
    print(a)
if __name__ == '__main__':
    func()

来看控制台输出

12

在func函数中if外的代码可以访问if内的变量,说明if内的作用域和if外是同一个作用域,在上面for中也是一样的,这说明if for 等语句内部的作用域和外部的作用域是相同的。