Python作用域问题详解

Python作用域问题

定义:在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。Python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。
作用域的产生:

  1. 只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。
  2. 在作用域中定义的变量,一般只在作用域中有效。
  3. 在if-elif-else、for-else、while、try-except/try-finally等关键字的语句块中并不会产生作用域

作用域问题:
L(local)局部作用域 函数内的命名空间

E(enclosing)嵌套作用域 外部嵌套函数的命名空间

G(global)全局作用域 所在模块(文件)的命名空间

B(built-in)内置作用域 Python内置模块的命名空间

下面给大家用例子分别解释

1.0 全局作用域

count = 10     #定义全局变量
if __name__ == "__main__":
    print(count)   # 调用全局变量

如果想在函数中调用全局变量的时候

count = 10     # 定义全局变量
def Printtime():    # 定义函数
    global count   # 使用global关键字使用全局变量
    print(count)  
Printtime()   # 调用函数

那么这样:

count = 10    # 定义全局变量
def Printtime():   # 定义函数
    global count   # 使用global关键字使用全局变量
    count = 1     # 将全局变量count赋值为1 
    print(count)   
Printtime()
print(count)

结果我们会发现,输出为都为1

2.0 局部作用域

程序实例:

def Printtime():
    count = 1
    print(count)
Printtime()
print(count)

运行结果:

NameError: name 'count' is not defined

所以说,函数里定义的为局部变量,为局部作用域,在函数外调用会报错

3.0 嵌套定义域

下面以闭包函数给大家举例:

程序示例:

def func1():     # 定义外层函数
    a = 1      # 定义嵌套作用域

    def func2(c,b):   # 定义嵌套函数
        print(a)      # 输出 嵌套作用域变量
        d =  c+b+a    # 调用嵌套作用域变量来定义局部变量
        return d   
    return func2
ret = func1()
print(ret(1,2))

运行结果:

1
4

嵌套作用域变量,也有关键字nonlocal ,随后可以给嵌套作用域变量进行重新赋值

def func1():     # 定义外层函数
    a = 1      # 定义嵌套作用域

    def func2(c,b):   # 定义嵌套函数
        nonlocal a 
        a = 5 
        d =  c+b+a    # 调用嵌套作用域变量来定义局部变量
        return d   
    return func2
ret = func1()
print(ret(1,2))

程序示例:

8

4.0 内置定义域

系统固定模块里面的变量,比如int, bytearray等。

if __name__ == "__main__":  # 内置定义域

5.0 加载变量搜索变量的优先级

加载变量的优先级顺序依次是:py 内置作用域>当前模块中的全局(文件从上而下读取)>外层作用域>局部作用域
搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

发布了44 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45144837/article/details/104084140
今日推荐