您好,登录后才能下订单哦!
Python函数的作用域是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
关于作用域
Python的作用域可以分为四种:
l L (Local) 局部作用域
l E (Enclosing) 闭包函数外的函数中
l G (Global) 全局作用域
l B (Built-in) 内建作用域
变量/函数 的查找顺序:L –> E –> G –>B
意思是,在局部找不到的,便去局部外的局部作用域找(例如 闭包),再找不到的就去全局作业域里找,再找不到就去内建作业域中找。
影响变量/函数作用范围的有:
l 函数:def 或 lambda
l 类:class
l 关键字:global noglobal
l 文件:*py
l 推导式:[],{},()等,仅限Py3.x中,Py2.x会出现变量泄露。
1、赋值在前,引用在后
# ------同作用域内------ name = "MING" print(name) # ------不同作用域内------ name = "MING" def main(): print(name)
2、引用在前,赋值在后(同一作用域内)
print(name) name = "MING" # UnboundLocalError: local variable 'name' referenced before assignment
3、赋值在低层,引用在高层
# L -> E -> G -> B # 从左到右,由低层到高层 def main(): name = "MING" print(name) # NameError: name 'name' is not defined
关于改变作用域
变量的作用域,与其定义(或赋值)的位置有关,但不是绝对相关。因为我们可以在某种程度上去改变向上的作用范围。
l 关键字:global将 局部变量 变为全局变量
l 关键字:nonlocal可以在闭包函数中,引用并使用闭包外部函数的变量(非全局的噢)
global好理解,这里只讲下nonlocal。
先来看个例子
def deco(): age = 10 def wrapper(): age += 1 return wrapper deco()()
运行一下,会报错:
# UnboundLocalError: local variable 'age' referenced before assignment
但是这样就OK
def deco(): age = 10 def wrapper(): nonlocal age age += 1 return wrapper deco()() # 输出:11
其实,你如果不使用 +=、-=等一类的操作,不加nonlocal也没有关系。这就展示了闭包的特性。
def deco(): age = 10 def wrapper(): print(age) return wrapper deco()() # 输出:10
感谢各位的阅读!看完上述内容,你们对Python函数的作用域是什么大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。