四、Python函数 之 5、变量作用域

5、变量作用域

1)理解变量作用域

根据定义变量的位置:

  • 局部变量:在函数中定义的变量包括参数
  • 全局变量:在函数外面、全局范围内定义的变量

2)变量字典

获取变量字典:

  • globals() 返回全局范围内所有变量组成的“变量字典”
  • locals() 返回当前局部范围内所有变量组成的“变量字典”
  • vars(object) 返回指定对象的范围内所有变量组成的“变量字典”,若不传入object 参数,vars() 和 local() 的作用相同
# 全局变量
a = 10

def info():
    # 局部变量
    b = 'python'
    print(locals())   # 局部变量字典
    
def bar():
    # 局部变量
    c = 'java'
    print(locals())   # 局部变量字典
    
print(globals())  # 全局变量字典
info()
bar()
print(locals())   # 全局范围内用 local() 和 globals() 作用相同
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000C3BF10B0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Code/src/2019.06.21/04.py', '__cached__': None, 'a': 10, 'info': <function info at 0x000000C3BD5D3E18>, 'bar': <function bar at 0x000000C3BF373950>}
{'b': 'python'}
{'c': 'java'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000C3BF10B0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Code/src/2019.06.21/04.py', '__cached__': None, 'a': 10, 'info': <function info at 0x000000C3BD5D3E18>, 'bar': <function bar at 0x000000C3BF373950>}

分析:全局变量字典中显示了 Python 自动添加的其他全局变量。

3)处理局部变量遮蔽全局变量

说明:全局变量默认可在所有函数内访问,若在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情形。

name = 'python'

def info():
    print(name)
    
info()

python

name = 'python'

def info():
    print(name)
    # 在函数内对变量赋值时定义了新的变量,导致前一行的 name 没有定义,则报错:这个局部变量在赋值之前使用了。
    # 即此时不认为 name 为全局变量而是新变量
    name = 'java' 
    print(name)
    
info()

UnboundLocalError: local variable ‘name’ referenced before assignment

解决方式:

  • 使用 golbals() 在函数中访问被遮蔽的全局变量

    name = 'python'
    
    def info():
        print(globals()['name'])    # 使用golbals() 在函数中访问被遮蔽的全局变量
        
        name = 'java'   
        print(name)
        
    info()
    print(name)   # 全局变量没有改变
    

    python
    java
    python

  • global 声明该函数中 name 始终使用全局变量

name = 'python'

def info():
    global name    # global 声明该函数中 name 始终使用全局变量
    
    name = 'java'  # 此时,此处不是重新定义局部变量
    print(name)
    
info()
print(name)   # 全局变量改变

java
java

猜你喜欢

转载自blog.csdn.net/qq_36512295/article/details/94209085