python3的变量作用域规则和nonlocal关键字,Python面试及答案

本文探讨了Python3中的变量作用域规则,解释了为何会出现局部变量的暂时性死区,并通过示例介绍了如何使用global和nonlocal关键字来管理变量作用域。特别是nonlocal关键字,用于在闭包中引用和修改外部作用域的变量。
摘要由CSDN通过智能技术生成

对于python来说也是一样的问题,python代码在执行前首先会被编译成字节码,这就会导致某些时候实际执行的程序会和我们看到的产生出入。不过我们有dis模块帮忙,它可以输出python对象的字节码,下面我们就来看下经过编译后的f:

dis(f)

2 0 LOAD_GLOBAL 0 (print)

2 LOAD_FAST 0 (i)

4 CALL_FUNCTION 1

6 POP_TOP

3 8 LOAD_CONST 1 (‘a’)

10 STORE_FAST 0 (i)

4 12 LOAD_GLOBAL 0 (print)

14 LOAD_FAST 0 (i)

16 CALL_FUNCTION 1

18 POP_TOP

20 LOAD_CONST 0 (None)

22 RETURN_VALUE

其中LOAD_FAST和STORE_FAST是读取和存储local作用域的变量,我们可以看到,i变成了局部作用域的变量!而对i的赋值早于i的定义,所以报错了。

产生这种现象的原因也很简单,python对函数的代码是独立编译的,如果未加说明而在函数内对一个变量赋值,那么就认为你定义了一个局部变量,从而把外部的同名对象屏蔽了。这么做无可厚非,毕竟python没有独立的声明一个局部变量的语法,但结果就会造成我们看到的类似暂时性死区的现象。所以请允许我把es6的概念套用在python身上。

消除暂时性死区

既然知道问题的症结在于python无法区分局部变量的声明和定义,那么我们就来解决它。

对于一个可以区分声明和定义的语言来说是没有这种烦恼的,比如c:

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

int i = 0;

void f(void)

{

i++;

printf("%d\n", i); // 1

const char *i = “he

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值