python 中的变量作用域(variable scope)

一般来说,python 中包含如下四种变量作用域

  • local:函数本地作用域
  • enclosed:闭包作用域
  • global:全局作用域
  • built-in:内建类型作用域

当 python 解析器遇到某一个变量时,它就会以如下优先级确定这个变量定义在哪里。我们可以看出,这遵循了一种 “自发现位置开始由内到外” 的规则。

local > enclosed > global > built-in

1. local 作用域

def foo():
    x = 1
    print(locals())
    y = 2
    print(locals())

foo()

图中的 xy 都是 local 作用域的变量。

他们只存在于 foo 函数中,这意味着当 foo 函数执行结束时,他们就无法被再次使用,并且可能会被垃圾回收掉(除非他们成为闭包变量 - enclosed)

并且要注意的是,每当 foo 函数被执行一次时,xy 都会被创建一次,包括每次递归。

注意到代码中的 print(locals()) 部分,他可以实时的查看到当前作用域中有多少本地变量。上面的函数输出为

{'x': 1}
{'x': 1, 'y': 2}

2. enclosed 作用域

def outer():
    x = 1
    y = 'b'

    def inner():
        return x, y

    return inner


i = outer()
print(i())
print(i.__closure__)

这是一个典型的闭包定义,在 inner 中引用了外层函数的局部变量 xy
这样的结果是,xy 将一直维持在内存中,供 inner 函数使用。

注意到 print(i.__closure__) 这一行代码,这是一种获取一个函数在使用的闭包变量的途径。

上面的函数输出如下,我们可以看到,这个函数对一个 int 类型的变量和一个 str 类型的变量维持了引用(即 xy

(1, 'b')
(<cell at 0x1065633a0: int object at 0x1064000f0>, <cell at 0x1065625f0: str object at 0x10651f6b0>)

2.1 回顾作用域的强度比较

回到最开始的作用域强度讨论,由于 local 强于 enclosed,下面的代码将使用 inner 函数的本地变量,而非闭包变量

def outer():
    x = 1
    y = 'b'

    def inner():
        x = 'b'
        y = 2
        return x, y

    return inner


i = outer(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郎碎碎念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值