首页 > 编程语言 >Python-10作用域、LEGB规则

Python-10作用域、LEGB规则

时间:2022-08-23 16:26:05浏览次数:57  
标签:10 f2 作用域 a1 Python a2 print def

作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

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

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

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

有四种作用域:

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

搜索变量名的优先级: L –> E –> G –> B。(局部作用域>嵌套作用域>全局作用域>内置作用域)

LEGB法则:当在函数中使用未确定的变量时,Python会按照优先级依次搜索4个作用域,以此来确定变量的意义。首先搜索局部作用域(L),之后是上一层嵌套结构中def或lambda函数的嵌套作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按照这换个查找原则,在第一处找到的地方停止。如果没有找到,则会触发NameError错误。在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

 1 #作用域
 2 a1 = 10          #全局作用域
 3 def pri():
 4     print(a1)
 5 pri()
 6 
 7 
 8 def pri1():
 9     a2 = 20       #局部作用域
10     print(a2)
11 pri1()
12 #print(a2)        #这句这样写则会报错,因为a2的作用域只在函数内部并不是全局作用域,注意区别
13 
14 
15 #嵌套作用域
16 def f1():
17     n = 10         #在f1函数中,是局部作用域 相对于f2函数,是嵌套作用域
18     def f2():
19         m = 20     #局部作用域
20         print(n)
21     f2()
22 
23 
24 #内置作用域 系统自带
25 print(__name__)   #内置作用域

 1 #搜索变量名的优先级:局部作用域>嵌套作用域>全局作用域>内置作用域
 2 #LEGB法则:当在函数使用未确定的变量名时,Python会按照优先级依次搜索4个作用域,
 3 # 以此来确定该变量的意义。首先搜索局部作用域(L),之后是上一层嵌套结构中def或lambda
 4 # 函数的嵌套做作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按照这个查找原则,
 5 # 在第一处找到的地方停止。如果没有找到,则触发NameError错误。
 6 a1 = 10   # G
 7 def f1():
 8     a1 = 20  # E
 9     def f2():
10         a1 = 30 # L
11         print(a1)
12     f2()
13 f1()
14 
15 
16 #********************************************
17 a1 = 10   # G
18 def f1():
19     a1 = 20  # E
20     def f2():
21         # a1 = 30 # L
22         print(a1)
23     f2()
24 f1()
25 # ********************************************
26 a1 = 10   # G
27 def f1():
28     # a1 = 20  # E
29     def f2():
30         # a1 = 30 # L
31         print(a1)
32     f2()
33 f1()
34 
35 # ******************************************
36 
37 a2 =  100
38 def f3():
39     global a2             #使用global将全局变量a2的地址给引用过来了,就会改变全局变量的值
40     a2 = 60
41     print(a2)
42 f3()
43 print(a2)                 #查看全局变量a2确实是变了,变成了60

 

标签:10,f2,作用域,a1,Python,a2,print,def
From: https://www.cnblogs.com/yyym/p/16601378.html

相关文章

  • 【735】相关python函数用在算法题中提高效率
    Counter:用来计数使用fromcollectionsimportCounterfilter:用来表示满足一个函数的所有情况相关题目:260.只出现一次的数字III......
  • 斐波那契数列前1000项
    {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,57......
  • 《流畅的python》PDF高清版|百度云盘|免费下载
      《流畅的python》PDF高清版|百度云盘|免费下载  内容简介······【技术大咖推荐】“很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级P......
  • Python Numpy
    一、numpy简介NumPy(NumericalPython)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也征地数组运算提供大量的数据函数库NumPy的前身Numeric最......
  • python函数装饰器篇
    python装饰器专栏1.了解装饰器1.函数装饰器,函数的简单功能的增强2.类装饰器,复杂功能的增强2.闭包1.简单讲就是在函数内在嵌套一个函数,就变成了闭包//闭包的......
  • 1029 [NOIP2009]最优贸易 路径最小值最大值 spfa
    链接:https://ac.nowcoder.com/acm/contest/26077/1029来源:牛客网题目描述C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任......
  • 变量作用域
    python中一个变量能够被访问的范围叫做作用域。根据作用域的大小分为:全局变量局部变量全局变量python是解释型编程语言,解释器在运行一个python程序时会在计算机内存......
  • ubuntu16.04安装python3.5
    今天用了下阿里云的云服务器,装个python3真是各种踩坑。记录下吧:ubuntu自带了2.7。想要装3.5并设置为默认python版本。安装python3.5  sudoadd-apt-repository......
  • ubuntu18.04如何安装python3.5及其pip安装
    安装python3.5,ubuntu18.04默认python3.6,该版本部分库没有资源无法安装,所以更换为python3.5参考原文链接:http://blog.itpub.net/69989353/viewspace-2738095/sudoapt-get......
  • Python小程序(三):自动读取secure文件,并封禁异常IP地址
    Python小程序(三):自动读取secure文件,并封禁异常IP地址Python小白编写的内容。欢迎大家指正。#!python#-*-coding:utf-8-*-#时间:20220812#作者:ColoFly#转载请注......