Day4作用域,Python关键字global和nonlocal使用

简介: 作用域,Python关键字global和nonlocal使用

一、概念

作用域是指变量的有效范围。变量并不是在每一个位置都可以访问,访问权限取决于这个变量在哪里赋值,作用域哪个作用域内。在python中的作用域一共分为4种。分别是:

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

规则顺序: L –> E –> G –> B

先在局部作用域找,然后在闭包函数外的函数找,然后去全局找,然后去内置找。

def function_1():
    a = '1'
    def function_2():
        print(a)
        print(b)
        print(c)
    function_2()

b = 2
function_1()

上面的代码能够顺利执行,并打印a和b,c报错name 'c' is not defined。我们在function_2中并没有定义a和b两个变量,在上面代码b=2中,b作为了全局变量,属于全局作用域,没有定义在任何一个函数中。在function_1中定义a,这是一个局部变量,属于局部作用域,在function_1外部并不能访问到它,但是对于function_2中,变量a属于嵌套作用,在function_2中可以访问到,变量c属于局部作用域,在function_2之外无法访问。Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些标识符,我们之前用过的inputprintint等都属于内置作用域。

二、全局变量和局部变量

定义在函数内部的变量属于局部作用域,定义在函数之外的属于全局作用域。

局部变量只能在被声明的函数内部访问,全局变量可以在整个程序范围内访问。当我们调用函数时,函数内部的变量会被加入到作用域中。

total = 0
def sum(x,y):
    total = x + y  #这里total是局部变量
    print('函数内total是局部变量,值:',total)
    return  total
sum(1,2)
print('函数外total是全局变量, 值:',total)

输出
函数内total是局部变量,值: 3
函数外total是全局变量, 值: 0

三、global和nonlocal关键字

global:在函数内部声明全局变量,使得函数内部可以访问和修改全局变量的值

还是上述的例子,我们使用global函数使两个total的值相同

total = 0
def sum(x,y):
    global total   #不能直接赋值,需先定义
    total = x + y
    print('函数内total是局部变量,值:',total)
    return  total
sum(1,2)
print('函数外total是全局变量,值:',total)

输出:
函数内total是局部变量,值: 3
函数外total是全局变量, 值: 3

nonlocal:用于在嵌套函数中声明外部嵌套作用域中的变量,使得内部函数可以访问和修改外部函数中的变量。

def outer_function():
    y = 20

    def inner_function():
        y = 1
        print("内部函数 y 的值:", y)

    inner_function()
    print("外部函数 y 的值:", y)

outer_function()

输出:
内部函数 y 的值: 1
外部函数 y 的值: 20
def outer_function():
    y = 20

    def inner_function():
        nonlocal y
        y += 1
        print("内部函数 y 的值:", y)

    inner_function()
    print("外部函数 y 的值:", y)

outer_function()

输出:
内部函数 y 的值: 21
外部函数 y 的值: 21

四、使用场景

1、在函数内部修改全局变量

上面已有

2、在嵌套函数中访问外部函数的变量

上面已有

3、在闭包中使用外部变量

闭包是一种特殊的函数,可以访问其外部作用域中定义的变量。使用 nonlocal 关键字可以在闭包中修改外部变量的值。

def outer():
    x = 10

    def inner():
        nonlocal x
        x += 5
        return x
    return  inner

closure = outer()
print(closure())

输出:15
相关文章
|
27天前
|
测试技术 开发者 Python
对于Python中的异常要如何处理,raise关键字你真的了解吗?一篇文章带你从头了解
`raise`关键字在Python中用于显式引发异常,允许开发者在检测到错误条件时中断程序流程,并通过异常处理机制(如try-except块)接管控制。`raise`后可跟异常类型、异常对象及错误信息,适用于验证输入、处理错误、自定义异常、重新引发异常及测试等场景。例如,`raise ValueError("Invalid input")`用于验证输入数据,若不符合预期则引发异常,确保数据准确并提供清晰错误信息。此外,通过自定义异常类,可以针对特定错误情况提供更具体的信息,增强代码的健壮性和可维护性。
WK
|
2月前
|
Python
Python保留关键字
Python 的保留关键字是语言中具有特殊意义的单词,不能用作变量名、函数名或类名等标识符。Python 3.x 版本中的保留关键字包括 `False`、`await`、`else`、`import` 等共 35 个。使用这些关键字作为标识符会导致语法错误。随着 Python 版本的更新,保留关键字可能会有所变化。
WK
45 6
|
2月前
|
存储 Python
在Python中,什么是作用域
【10月更文挑战第12天】在Python中,什么是作用域
27 2
|
3月前
|
Python
关于 Python 列表解析式的作用域问题
关于 Python 列表解析式的作用域问题
58 11
|
2月前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
32 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
2月前
|
存储 自然语言处理 Python
解密 Python 的作用域和名字空间
解密 Python 的作用域和名字空间
22 1
|
4月前
|
Python
Python 中的关键字是什么?
【8月更文挑战第29天】
157 8
|
3月前
|
自然语言处理 算法 数据可视化
9-4|Python在一群人聊天记录中提取关键字 需要什么步骤
9-4|Python在一群人聊天记录中提取关键字 需要什么步骤
|
4月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
38 2
|
4月前
|
Python
深入解析 Python中的命名空间和作用域并举例
【8月更文挑战第15天】Python中的命名空间与作用域是理解变量组织与访问的核心。命名空间是名称到对象的映射,分为全局、局部和内置三种。作用域定义变量的可访问范围,遵循LEGB规则:局部(L)、闭包(E)、全局(G)、内置(B)。示例展示了如何通过`nonlocal`声明跨作用域修改变量。这些机制确保了变量的有效管理和代码的高效执行。
52 0