python全局变量与局部变量

我们都知道全局变量在所有函数内部都可以被访问到,但是如果在函数中定义了与全局变量同名的变量,此时,会发生局部变量遮蔽(hide)全局变量的情形。

a = 1
def fn():
    '''
    正常访问全局变量 
    '''
    print(a) # 1
fn()
a = 1
def fn():
    '''
    局部变量遮蔽全局变量情形
    '''
    print(a)
    a = 2
fn()
# UnboundLocalError: local variable 'a' referenced before assignment
# UnboundLocalError:赋值之前引用的本地变量'a'

上边第二段代码,我们在函数体最后定义了a变量,结果访问a报错!

python语法规定:在函数内部,对不存在的变量进行赋值时,默认就是重新定义新的局部变量。因此,函数内部,a = 2相当于重新定义了一个局部变量,这样全局变量a就会被遮蔽,所以会报错!

 

解决上述问题:

方法一:

使用globals():该函数,返回全局范围内所有变量组成的字典。(还有locals():该函数返回当前局部范围内所有变量组成的 ‘ 变量字典 ’ ;还有vars(object):该函数获取指定对象范围内所有变量组成的 “变量字典” , 如果不传入object,vars和object作用完全相同)

# 方法一:
a = 1
def fn():
    print(globals())
    print(globals()['a']) # 1
    a = 2
fn()
# 上边print输出的是一个字典
"""
{
   '__name__': '__main__', 
   '__doc__': None,
   '__package__': None, 
   '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0171C230>,
   '__spec__': None, 
   '__annotations__': {}, 
   '__builtins__': <module 'builtins' (built-in)>, 
   '__file__': 'G:/mypython/mk/py_package/m4.py', 
   '__cached__': None, 
   'a': 1, 
   'fn': <function fn at 0x0173F7C8>
}
"""

方法二:

在函数中声明全局变量:

a = 'global'
def fn():
    global a
    print(a) # global
    a = "local"
fn()
print(a) # local

上边代码,在函数中声明全局变量a,程序会把a变量当成全局变量,这意味着fn函数里边对a赋值的语句,只会对全局变量赋值,而不是重新定义局部变量!!!

补充:

如果全局和函数内部有同名变量,函数内部只有加了global之后,全局变量才会被局部变量给覆盖:

b = '123'
def a():
    b = '0'
a()
print(b) // '123'
# ---------------------------
b = '123'
def a():
    global b
    b = '0'
a()
print(b) // '0'

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值