先看一段代码
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 等语句内部的作用域和外部的作用域是相同的。