Python3作用域及相关的坑

昨儿面字节....面试官手下留情出了一道二分变种的easy...我写出来了...但是因为作用域问题一路error....下面进行一下总结。本文主要参考菜鸟教程相关词条。

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是:

有四种作用域:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等,最后被搜索。

全局变量在局部作用域中可以读取,但是无法修改(我当时就是一直这儿报错)。

以下面这个例子为例:

#!/usr/bin/python3   
a = 10 
def test():    
     a = a + 1     
     print(a) 
test()

运行会报UnboundLocalError也就是局部作用域引用错误,因为其是在局部作用域中对外层进行修改,会报错。

可以加一个global声明,才能对外层进行修改。

#!/usr/bin/python3   
a = 10 
def test(): 
     global a
     a = a + 1     
     print(a) 
test()

这时就可以正常修改不会报错了。同理,在嵌套的函数中使用nonlocal关键字进行声明,可以对外层的变量进行修改。

#!/usr/bin/python3   
def outer():
     num = 10
     def inner():
         nonlocal num   # nonlocal关键字声明
         num = 100
         print(num)
     inner()
     print(num)
 outer()

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注