python 的全局变量与 global的说明

在python中,在函数外部定义的变量是全局变量。

全局变量可以在函数内部引用。

g_var = 1

def test():
    print(g_var)

在函数内部引用全局变量,如果不修改,可以不用 global 关键字声明。以上代码,因为在 test 函数内部,g_var 变量没有定义,自然用外部定义的全局变量g_var 。

在python 中,一旦,引用了全局变量,再给一个与这个全局变量同名的 g_var 变量赋值,就会发生  UnboundLocalError: local variable 'g_var' referenced before assignment,理由是在函数内部给变量赋值意味着定义一个本地局部变量,这个变量就会被当做局部变量,如果这个变量在赋值前就被引用,则会出现异常。

解决问题的原理是:
如果这个变量是全局变量,就应该在使用前(引用与修改)用 global关键字申明;如果是局部变量,就应该在引用前定义。
定义在函数外面的变量默认是全局变量,可以在函数内部进行访问和修改(必须 global 申明)。但是如果在函数内部重新定义了一个名称相同的局部变量,那么它会覆盖掉全局变量,函数内部只能访问和修改局部变量,而不能访问全局变量。如果要修改一个全局变量,必须在函数内部用 global 来声明该全局变量。

例如:

g_var = 1

def test():
    global g_var
    
    g_var = g_var + 5
    print(g_var)

以上函数,如果不用 global 来申明 g_var 为全局变量,则 g_var = g_var + 5 语句不能执行,会产生异常。理由是 表达式 g_var + 5 是引用变量,而 g_var = 表示定义一个变量,在函数内部就是定义局部变量,在函数内部已经把 g_var 当作局部变量了,但 = 后面的 g_var + 5 又引用了该局部变量,所以就发生了“局部变量在赋值前被引用的”异常。解决办法是,用 global关键字声明该变量。

nonlocal变量

在Python中,除了global关键字,还有一个关键字叫做nonlocal,也可以在嵌套函数中访问外层函数中的变量。global关键字用于访问全局变量,而nonlocal关键字用于访问嵌套函数中的变量。
global 与 nolocal 的区别在于,使用nonlocal关键字声明的变量,可以在内嵌函数内部和外部函数中进行共享。而global关键字声明的变量是全局变量,能在整个程序中共享。

下面的示例程序演示了nonlocal的用法。

def outer_func():
    x = 100
    
    def inner_func():
        nonlocal x
        x += 1
        return x
    
    return inner_func()

print(outer_func()) # 输出101

在上述代码中,我们定义了一个outer_func()函数和inner_func()函数,inner_func()函数访问和修改了outer_func()函数中定义的局部变量x,通过nonlocal关键字声明的变量x,可以在内嵌inner_func()函数和外部函数outer_func()函数中共享。

  • 使用global关键字可以在函数内部访问和修改全局变量;使用global关键字声明的全局变量的范围为可以在整个程序中共享。
  • 使用nonlocal关键字可以在嵌套函数中访问和修改外层函数中的变量;使用nonlocal关键字声明的变量的范围为可以在嵌套函数内部和外部进行共享。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值