Python中关于“作用域”的学习

1.作用域的分类

在Python中,变量作用域决定了变量在哪里可以被访问和修改。Python的作用域规则是基于LEGB原则,即 Local , Enclosing , Global , Built-in ,这表示变量的查找顺序是:局部作用域、外部嵌套作用域、全局作用域和内置作用域。

(1)局部作用域(Local):当你在函数内部定义一个变量时,这个变量就属于局部作用域。它只能在函数内部被访问和修改。局部变量在函数每次被调用时创建,函数调用结束后,局部变量就会被终止

(2)部嵌套作用域(Enclosing):如果你在一个函数中定义了另一个函数,那么内部函数可以访问外部函数的变量,这些变量对于内部函数来说就构成了外部嵌套作用域。外部嵌套作用域的变量通常用于闭包。

(3)全局作用域(Global):在函数外部定义的变量属于全局作用域。全局变量可以在程序的任何地方被访问和修改。

(4)内置作用域(Built-in):Python内置了大量的函数和变量,如print()range()、len()......它们位于内置作用域中。内置作用域的变量可以在任何地方被访问,没有特定的定义位置。

接下来,就局部变量和全局变量举个例子:

student=40  # 此处student为全局变量

def class_one(boy, girl):
    student = boy + girl  # 此处student为局部变量
    print("函数内局部变量student:",student)
    return student

class_one(22,23)  # 调用class one函数
print("函数外部全局变量student:student)

从上面代码可知:所谓局部变量,指的是定义在函数内的变量。定义在函数内的变量,只能在函数内使用,它与函数外部,具有相同名称的其他变量没有任何关系。不同的函数,可以定义相同名字的局部变量,并且各个函数内的变量不会产生影响。 

总而言之,局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量是定义在函数外的变量,它拥有全局的作用域。

2.关于”global ”和”nonlocal ”关键字

在Python中,如果在函数内部想修改一个全局变量,使用global关键字来明。同样,如果想在一个内部函数中修改外部嵌套作用域的变量,使用nonlocal关键字来声明

”global ”

boy = 20 

def total boy():
    boy += 2
    print(boy)

total boy()

上述代码中,在函数内部对全局变量boy进行修改,Python会把变量boy当做是局部变量,而在进行“boy += 2”之前,我们是没有声明局部变量boy的,因此,程序会报错。

boy = 20

def total_boy():
    global boy  # 声明变量boy为全局变量
    boy += 2
    print(boy)

total boy()

此时,在函数内使用 global 关键字进行声明

②”nonlocal ”

def class_four():
    # 给外层的class_four函数定义一个count变量
    count = 40

    # 嵌套在内层的two_guys_in函数再给count重新赋值
    def two_guys_in():
        nonlocal count  # 只是修改嵌套作用域中的变量的值,而非创建新的变量
        count = 42  
    two_guys_in()
    # 在class_four函数中输出新赋值的count
    print(count)

class_four()  # 调用class_four函数

以上代码可知:若要修改外层函数class_four中的变量count(此时被赋值40),则需在内层中使用nonlocal关键字

可以看到,内层函数修改了变量值

还需注意的一点:使用 global关键字修饰的变量之前可以不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。

通俗点讲可以理解为:

使用 global关键字时,第一行可以不写/不定义全局变量。

def boys():
    global boy
    boy = 2

boys()
print(boy)

然后、使用nonlocal关键字时,外层应当已经有定义好变量了,不然改个锤子......

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值