python变量用域_说说 Python 的变量作用域

先来看一个示例:

def f1(a):

logging.info('a -> %s', a)

logging.info('b -> %s', b)

logging.info('f1(3) -> %s',f1(3))

运行结果:

ab6cbf12755b

因为 b 没有定义,所以在运行 f1() 函数时抛错了。

在 pycharm 中也会以红色波浪形式提示我们这个变量还未定义:

ab6cbf12755b

解决这个问题也很简单,先定义好变量 b 即可:

ab6cbf12755b

输出结果:

ab6cbf12755b

因为我们没有为 f1() 函数定义返回值,所以f1() 函数的输出为 None。

我们在 f1() 函数内部对 b 进行赋值操作,结果令人意外:

ab6cbf12755b

输出结果:

ab6cbf12755b

pycharm 也以红色波浪线提醒我们这里的 b 变量存在问题。

通过 dis 模块,我们可以查看 Python 函数的字节编码:

from dis import dis

logging.info('dis(f1) -> %s',dis(f1))

运行结果:

ab6cbf12755b

从字面码中可以看出,变量 a 与 b 都是从局部作用域(LOAD_FAST)中加载。而变量 b 在使用前没有被初始化,所以抛错。

可以通过把变量 b 定义为 global,来修复上述代码:

ab6cbf12755b

这时的变量 b 就会从全局作用域中加载,所以运行正常:

ab6cbf12755b

Luciano Ramalho (作者),安道,吴珂 (译者).流畅的Python[M].人民邮电出版社,2017:308-311.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值