python中if for 作用域问题

先看一段代码

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 等语句内部的作用域和外部的作用域是相同的。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值